繁体   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