[英]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.