标题:如何查看汇编程序的当前变量值?
只看楼主
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
结帖率:100%
已结贴  问题点数:20 回复次数:5 
如何查看汇编程序的当前变量值?
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值的内容?
搜索更多相关主题的帖子: ENDS MOV SUM DB 查看 
2020-06-21 23:20
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:10 
程序代码:
    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


暂时没地方实验,手写的

梦想拥有一台龙芯3A-4000
2020-06-21 23:50
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:10 
楼上写的是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

2020-06-22 05:52
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 

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

再说二位写了半天,也才叫个“近似”intel汇编,呵呵

梦想拥有一台龙芯3A-4000
2020-06-22 20:01
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1728
专家分:3216
注 册:2015-12-2
得分:0 
回复 3楼 Valenciax
结果应该是446为什么结果是10556?
2020-06-22 21:29
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
回复 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
...
...
2020-06-23 06:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502222-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016554 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved