簡體   English   中英

此x86匯編程序如何工作

[英]How does this x86 assembly program work

這是一個x86 asm程序,它在屏幕中間顯示從000到999的“計數器”,可以正常工作(我沒有寫)。 問題是我試圖了解其工作原理。 程序中DIV和STACK的用法是什么。

程序將如何知道如何從例如009到010。內部循環是什么?

我知道它如何清除屏幕並打印到屏幕中間,並且我知道時鍾延遲功能。

DIVPUSHPOP在此程序中有什么作用?

基本上,我試圖跟蹤它並了解所使用的功能。 我還是一個初學者,請幫助。 謝謝。
這是代碼:

.MODEL SMALL
.STACK 64
.DATA
CNT DW 0h
.CODE
MOV AX,@data
MOV DS,AX

MOV AX, 0600H
MOV BH,07
MOV CX, 0000
MOV DH,12
MOV DL,39       

INT 10H

MOV AX,0600H
MOV BH,07 
MOV CX,0000 
MOV DX,184FH
INT 10H         

MOV CNT,0

L1: MOV AH,02h
MOV BH,0
MOV DH,12
MOV DL,39
INT 10h         

MOV AX,CNT
MOV BL,10
DIV BL              
PUSH AX

MOV AH,00
MOV BL,10
DIV BL                
PUSH AX               
MOV DL,AL
ADD DL,48
MOV AH,02h
INT 21h

POP AX
MOV DL,AH
ADD DL,48       
MOV AH,02h
INT 21h

POP AX
MOV DL,AH
ADD DL,48
MOV AH,02h      
INT 21h             

MOV CX, 0007h
MOV DX, 2120h 
MOV AH, 86H         
INT 15H             

INC CNT
CMP CNT,999
JBE L1  

MOV AH,4ch          
INT 21h
END

程序如何知道如何從009跳到010,內循環是什么?

內部循環由L1標簽到JBE L1指令形成。 存儲器CNT保存正在顯示的計數器。 它從可執行文件初始化為零,然后遞增( INC CNT ),與999相比,並在小於或等於它時循環。

DIV,PUSH和POP在此程序中有什么作用?

目的是將CNT值拆分為單獨的數字並顯示它們。 DIV BLAX除以BL然后將商存儲在AL ,將余數存儲在AH

也許最好的解釋是通過一個例子。 假設CNT的值為123。要計算每個可打印的位數,我們將除以10並得到12的商,余數為3。現在,3是我們最后需要打印的內容,因此需要將其存儲在堆。 然后,我們將重復此過程,得到2,然后是1。現在,我們可以打印出1,彈出堆棧中的2並進行打印,然后彈出3並打印出來,這樣我們就打印了123。

代碼段

MOV DL,AH
ADD DL,48       
MOV AH,02h
INT 21h

負責打印每個數字。 它首先獲取存儲在AH的余數,將48(030h)加到ASCII數字('0'= 30h ..'9'= 39h),然后調用函數02h / int21在屏幕上打印一個字符。

該指令:

.STACK 64               // reserve a 64 bytes "stack space" for temp data

該指令:

DIV BL                  // divide the contents of register ax by register bl

因為它們被10除,所以我認為這是為了顯示每個數字。

循環在這里:

INC CNT                 // increment (add 1 to) variable CNT (in .DATA)
CMP CNT,999             // compare CNT and 999
JBE L1                  // Jump Below or Equal (to label 'L1')

順便說一句,您沒問過的一點代碼是這樣的:

MOV CX, 0007h           // high bytes of wait time \__ microseconds
MOV DX, 2120h           // low bytes of wait time  /   (this is ~0.47 secs)
MOV AH, 86H             //
INT 15H                 // INT 15H/86H is wait ("sleep")

暫無
暫無

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

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