数据如何存储在内存或寄存器中
How data is stored in memory or register
我是汇编语言的新手,学习它是为了考试。我是一名程序员,曾在 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
寄存器由位组成。一个位可以有逻辑值0或1。它对我们来说是一个"logic value",但实际上它是由硬件内部的某种电压表示的。例如,4-5 伏被解释为 "logic 1",0-1 伏被解释为 "logic 0"。 BX 寄存器有 16 个这样的位。
假设BX(Base address register)的当前内容是:0000000000110110。因为人类很难读取那些长长的0s和1s,所以我们将每4位组合成1个Hexnumber,得到一个更具可读性的格式。 CPU 不知道什么是十六进制数或十进制数。它只能使用二进制代码。好的,让我们为 BX 寄存器使用更易读的格式:
0000 0000 0011 0110 (actual BX content)
0 0 3 6 (HEX format for us)
54 (or corresponding decimal value)
当您将此值 (36h) 发送到输出终端时,它会将此值解释为 ASCII 字符。因此它将显示 36h 值的“6”。
当你想用汇编加 6 + 2 时,你将 0110 (6) 和 0010 (2) 放在寄存器中。您的汇编程序 TASM 正在为您完成这项工作。它允许您在 asm 源代码中写入“6”(ASCII)或 0x6(十六进制)甚至 6(十进制),并将其转换为寄存器接受的二进制数。警告:“6”不会将值 6 放入寄存器,而是将 6 的 ASCII 代码放入寄存器。您不能直接用它计算。
例子: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 字符。通过在互联网上查找数百个 ASCII 表之一,您会发现“1”-ASCII 字符的代码是 31h。因此,您需要将 3131h 发送到您的终端:
0011 0001 0011 0001 (binary)
3 1 3 1 (hex)
12593 (decimal)
执行此操作的技巧是使用 div
指令将 11 (1011) 除以 10。除以 10 后,您会得到结果和余数。您需要将余数转换为 ASCII 码,您需要将其保存到缓冲区中。然后通过将最后一步的结果再次除以 10 来重复该过程。你需要这样做,直到结果为0。(使用div
操作有点棘手,你得自己查)
二进制(十进制):
将 1011 (11) 除以 1010 (10):
结果:0001 (1) 余数:0001 (1) -> 将余数转换为 ASCII
再次将结果除以 1010 (10):
结果:0000 (1) 余数:0001 (1) -> 将余数转换为 ASCII
我是汇编语言的新手,学习它是为了考试。我是一名程序员,曾在 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
寄存器由位组成。一个位可以有逻辑值0或1。它对我们来说是一个"logic value",但实际上它是由硬件内部的某种电压表示的。例如,4-5 伏被解释为 "logic 1",0-1 伏被解释为 "logic 0"。 BX 寄存器有 16 个这样的位。
假设BX(Base address register)的当前内容是:0000000000110110。因为人类很难读取那些长长的0s和1s,所以我们将每4位组合成1个Hexnumber,得到一个更具可读性的格式。 CPU 不知道什么是十六进制数或十进制数。它只能使用二进制代码。好的,让我们为 BX 寄存器使用更易读的格式:
0000 0000 0011 0110 (actual BX content)
0 0 3 6 (HEX format for us)
54 (or corresponding decimal value)
当您将此值 (36h) 发送到输出终端时,它会将此值解释为 ASCII 字符。因此它将显示 36h 值的“6”。
当你想用汇编加 6 + 2 时,你将 0110 (6) 和 0010 (2) 放在寄存器中。您的汇编程序 TASM 正在为您完成这项工作。它允许您在 asm 源代码中写入“6”(ASCII)或 0x6(十六进制)甚至 6(十进制),并将其转换为寄存器接受的二进制数。警告:“6”不会将值 6 放入寄存器,而是将 6 的 ASCII 代码放入寄存器。您不能直接用它计算。
例子: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 字符。通过在互联网上查找数百个 ASCII 表之一,您会发现“1”-ASCII 字符的代码是 31h。因此,您需要将 3131h 发送到您的终端:
0011 0001 0011 0001 (binary)
3 1 3 1 (hex)
12593 (decimal)
执行此操作的技巧是使用 div
指令将 11 (1011) 除以 10。除以 10 后,您会得到结果和余数。您需要将余数转换为 ASCII 码,您需要将其保存到缓冲区中。然后通过将最后一步的结果再次除以 10 来重复该过程。你需要这样做,直到结果为0。(使用div
操作有点棘手,你得自己查)
二进制(十进制):
将 1011 (11) 除以 1010 (10):
结果:0001 (1) 余数:0001 (1) -> 将余数转换为 ASCII
再次将结果除以 1010 (10):
结果:0000 (1) 余数:0001 (1) -> 将余数转换为 ASCII