数据如何存储在内存或寄存器中

时间:2015-01-09 07:27:00

标签: windows assembly tasm

我是汇编语言的新手,并为考试而学习。我是程序员,曾在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

1 个答案:

答案 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