【发布时间】:2023-03-10 04:36:01
【问题描述】:
我是汇编语言的新手,并为考试而学习它。我是一名程序员,曾在 C、C++、java、asp.net 工作过。
我对 win xp 有兴趣。
我想知道数据是如何存储在内存或寄存器中的。我想知道过程。我相信它是这样的:
在输入数据时,例如。编号:
输入十进制编号 -> 转换为十六进制 -> 将十六进制的 ASCII 存储在寄存器或内存中。
获取数据时:
寄存器或内存中十六进制的 ASCII -> 转换为十六进制 -> 在监视器上显示十进制编号。
是否正确。 ?如果没有,任何人都可以用简单的例子告诉我
好的,迈克尔:请参阅下面的代码,我试图将两个 1 位数字相加以显示 2 位结果,例如 6+5=11
Sseg segment stack
ends
code segment
;30h to 39h represent numbers 0-9
MOV BX, '6' ; ASCII CODE OF 6 IS STORED IN BX, equal to 36h
ADD BX, '5' ; ASCII CODE OF 5 (equal to 35h) IS ADDED IN BX, i.e total is 71h
谢谢迈克尔……我接受我的错误……
好的,所以在这里,BX=0071h,对吧?是不是意味着 BL=00 和 BH=71 ?
但是,如果我这样做,我不知道如何显示结果 11 ?
嘿Blechdose,
你能帮我解决另一个问题吗?我正在尝试比较 2 个值。如果两者相同,则 dl=1,否则 dl=0。但是在下面的代码中,相同的值显示为 0,它显示为 0。为什么它不跳转?
sseg segment stack
ends
code segment
assume cs:code
mov dl,0
mov ax,5
mov bx,5
cmp ax,bx
jne NotEqual
je equal
NotEqual:
mov dl,0
add dl,30h
mov ah,02h
int 21h
mov ax,4c00h
int 21h
equal: mov dl,1
add dl,30h
mov ah,02h
int 21h
mov ax,4c00h
int 21h
code ends
end NotEqual
end equal
【问题讨论】:
-
这并没有真正的答案,因为您可以随心所欲地存储它。当然,通常它会存储为 int,因此除了输入和输出之外不涉及 ascii。
-
这里的“输入数据”和“获取数据”是什么意思?请用一些实际的(注释的)代码来说明。我不确定为什么您似乎认为字符串到整数和整数到字符串的转换以某种方式直接连接到 CPU 寄存器(?)。寄存器只保存固定数量的位,仅此而已。
-
输入意味着我在寄存器6和5中输入数据,进行操作(如加法),6+5,并从寄存器中取出结果11到监视器。
-
你在写代码的时候需要多注意你在写什么:
'6' + '5'等于6BH,而不是69H;并且ADD AL,30H不会从AL中减去30H,而是将30H添加到AL。此外,BH是BX的高字节。6BH的高字节为零。 -
'6' + '5'不等于71H,它仍然是6BH。BX的低字节是BL,所以这就是6BH。要将您的值转换为可以显示的十进制字符串,您首先必须减去2*30H,然后重复除以 10,直到商为 0。每个除法的余数是当前最低有效十进制数字,所以你添加30H并将其放在缓冲区中。