我是汇编语言的新手,并为考试而学习。我是程序员,曾在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?
Hey 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
答案 0 :(得分:1)
寄存器由位组成。一个位可以具有逻辑值0或1.它对于我们来说是“逻辑值”,但实际上它由硬件内部的某种电压表示。例如,4-5伏被解释为“逻辑1”,0-1伏被解释为“逻辑0”。 BX寄存器有16个这样的位。
让我们说BX的当前内容是:0000000000110110。因为很难读取人类的0和1长行,我们将每4位组合成1个十六进制数,以获得更易读的格式。 CPU不知道十六进制数或十进制数是多少。它只能用于二进制代码。好的,让我们为BX寄存器使用更易读的格式:
0000 0000 0011 0110 (actual BX content)
0 0 3 6 (HEX format for us)
54 (or corresponding decimal value)
当您将此值(36h)发送到输出终端时,它会将此值解释为ASCII-charakter。因此,它将为36h值显示“6”。
如果要使用汇编添加6 + 2,则将0110(6)和0010(2)放入寄存器。您的汇编程序TASM正在为您完成工作。它允许你在asm-sourcecode中写入'6'(ASCII)或0x6(十六进制)甚至6(十进制),并将它转换为二进制数,寄存器接受。警告:'6'不会将值6放入寄存器,而是将ASCII码放入6.您无法直接计算。
示例:6 + 2 = 8
mov BX, 6h ; We put 0110 (6) into BX. (actually 0000 0000 0000 0110,
; because BX is 16 Bit, but I will drop those leading 0s)
add BX, 2h ; we add 0010 (2) to 0110 (6). The result 1000 (8) is stored in BX.
add BX, 30h ; we add 00110000 (30h). The result 00111000 (38h) is stored in BX.
; 38h is the ASCII-code, which your terminal output will interpret as '8'
当你进行6 + 5 = 11的计算时,它会更加复杂,因为你必须将结果1011(11)转换成2个ASCII-Digits'1'和'1'(3131h = 00110001 00110001 )
在添加6(0110)+ 5(0101)= 11(1011)后,BX将包含此(无空格):
0000 0000 0000 1011 (binary)
0 0 0 B (Hex)
11 (decimal)
|__________________|
BX
|________||________|
BH BL
BH是BX的较高字节,而BL是BX的较低字节。在我们的例子中,BH是00h,而BL包含0bh。
要在终端输出上显示求和结果,需要将其转换为ASCII码。在这种情况下,您要显示“11”。因此,您需要两次'1'-ASCII-Character。通过在互联网上查找其中一个hunderds ASCII表,您会发现'1'-ASCII-Charakter的代码是31h。因此,您需要将3131h发送到您的终端:
0011 0001 0011 0001 (binary)
3 1 3 1 (hex)
12593 (decimal)
这样做的诀窍是将11(1011)除以10 div
指令。在除以10之后,你会得到一个结果和一个余数。您需要将余数转换为ASCII数,您需要将其保存到缓冲区中。然后通过再次将结果与最后一步除以10来重复该过程。你需要这样做,直到结果为0.(使用div
操作有点棘手。你必须自己查看)
二进制(十进制):
将1011(11)除以1010(10):
结果:0001(1)余数:0001(1) - >转换为alwaysderto ASCII
再次将结果除以1010(10):
结果:0000(1)余数:0001(1) - >转换为alwaysderto ASCII