注册 登录
编程论坛 汇编论坛

如何查看汇编程序的当前变量值?

ehszt 发布于 2020-06-21 23:20, 6198 次点击
DATAS SEGMENT
    AGES DB 21H,23H,33H,52H,65H
         DB 44H,82H,15H,87H,24H
    NUM EQU $ - AGES
    SUM DW ?
DATAS ENDS
STACKS SEGMENT STACK
        DB 30H DUP(?);此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV CX,NUM
    XOR AX,AX
    MOV SI,OFFSET AGES
NEXT:
    ADD AX,[SI]
    DAA
    ADC AH,0
    XCHG AH,AL
    DAA
    XCHG AH,AL
    INC SI
    LOOP NEXT
    MOV SUM,AX
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
简单的相加程序,如何显示SUM值的内容?
5 回复
#2
ditg2020-06-21 23:50
程序代码:
    movw    sum, %ax
    pushw    %ax
    movw    %sp, %bp
    call    print
    popw    %ax

print:
    movw    $4, %cx
    movw    (%bp), %dx
print_hex:
    rolw    $4, %dx
    movw    $0xe0f, %ax
    andb    %dl, %al
    addb    $0x30, %al
    cmpb    $0x39, %al
    jbe    good_hex
    addb    $0x41-0x30-0xa, %al
good_hex:
    int    $0x10
    loop    print_hex
    ret


暂时没地方实验,手写的
#3
Valenciax2020-06-22 05:52
楼上写的是at&t汇编(且显示16进制),和题主的intel汇编不同,不能在同一个编译器编译,下面是intel汇编.
在MOV SUM,AX
之下加一句
call print_ax
在CODES ENDS之上加一段子程序如下:
程序代码:

print_AX:        ;数值转10进制字符串子程序
mov cx,0         ;清0
mov bx,10         ;除法准备
@@:

 mov dx,0         ;清0
div bx         ;ax /10,若1234,除10后,dl得余数4
push dx         ;保存, ax=1234,依次保存4,3,2,1
inc cx         ;累加个数
or ax,ax         ;是否已除尽
jnz @b         ;不是,再除
@@:

 pop dx          ;后入先出,先印出第一数,然后第二....
or dl,'0'        ;转ascii
mov ah,2

 int 21h

 loop @b         ;下一个
ret

#4
ditg2020-06-22 20:01

俺的也是intel汇编(起码不是mips汇编)

再说二位写了半天,也才叫个“近似”intel汇编,呵呵
#5
ehszt2020-06-22 21:29
回复 3楼 Valenciax
结果应该是446为什么结果是10556?
#6
Valenciax2020-06-23 06:25
回复 5楼 ehszt
之前没看楼主的程式....
若结果是446,那么猜猜题目应该是:有10个压缩BCD (21H,就是10进制的21),相加后并输出结果
若没猜错的话,楼主的程式本身有问题.
1. AX,[SI] 取的值是WORD,不是BYTE
2. DAA并不是这样用.
3. 然后以下的都乱糟糟.
其实只要DEBUG一下,看看每一条指令是否生效就是

以下是相关指令.

在文件最前(DATAS之上)加上一条伪指令
.286    ;以配合下面的SHR

程序代码:

....
....
MOV BX,0
NEXT:
MOV AL,[SI] ;取得AL的BCD
MOV AH,AL   ;覆制一份
SHR AH,4    ;将BCD十位移至个位,比如21->02
AND AL,0FH  ;遮蔽十位,比如21->01
AAD         ;BCD除法调整,比如 0201 -> 15H
MOV AH,0    ;清除
ADD BX,AX   ;累加
INC SI
LOOP NEXT
MOV SUM,BX
MOV AX,SUM
MOV DX,0
CALL PRINT_AX
...
...
1