簡體   English   中英

數據如何存儲在內存或寄存器中

[英]How data is stored in memory or register

我是匯編語言的新手,並在考試中學習它。 我是一名程序員,曾在 C、C++、java、asp.net 中工作。

我有win xp tasm。

我想知道數據是如何存儲在內存或寄存器中的。 我想知道過程。 我相信它是這樣的:

在輸入數據時,例如。 數字:

輸入十進制編號 -> 轉換為十六進制 -> 將十六進制的 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 ?

嘿布萊克多斯,

你能幫我解決另一個問題嗎? 我正在嘗試比較 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的邏輯值。對我們來說,它是一個“邏輯值”,但實際上它是由硬件內部的某種電壓來表示的。 例如,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 字符的代碼是 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM