【问题标题】:How data is stored in memory or register数据如何存储在内存或寄存器中
【发布时间】: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。此外,BHBX 的高字节6BH 的高字节为零。
  • '6' + '5' 不等于 71H,它仍然是 6BHBX 的低字节是BL,所以这就是6BH。要将您的值转换为可以显示的十进制字符串,您首先必须减去2*30H,然后重复除以 10,直到商为 0。每个除法的余数是当前最低有效十进制数字,所以你添加 30H 并将其放在缓冲区中。

标签: windows assembly tasm


【解决方案1】:

寄存器由位组成。一个位可以有逻辑值 0 或 1。它对我们来说是一个“逻辑值”,但实际上它是由硬件内部的某种电压表示的。例如,4-5 伏被解释为“逻辑 1”,0-1 伏被解释为“逻辑 0”。 BX 寄存器有 16 个这样的位。

假设 BX(Base address register) 的当前内容是: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 字符。因此它将显示 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 数字 '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。通过在 Internet 上查找数百个 ASCII 表之一,您会发现 '1'-ASCII-Charakter 的代码是 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

【讨论】:

  • 嘿 Blechdose,我在问题中编辑了另一个问题...请帮助解决这个问题。
  • 你应该为这个完全不同的问题提出一个新问题。我无法测试您的代码,而且我不熟悉 Windows 程序集,因为我使用的是 linux 程序集。我不知道如何处理 windows 中断。至少在 linux 中,您不能将要通过中断打印的值直接放入寄存器中。取而代之的是,您将保存值的地址/变量放入寄存器中。
  • 我想说十六进制和十进制是数字的文本序列化格式。一旦您了解寄存器中的整数是二进制的,这是讨论数字的十六进制和十进制字符串表示的有用方式。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2019-05-22
  • 2019-03-11
  • 2018-07-13
相关资源
最近更新 更多