2016-01-20 66 views
1

这是一个x86 asm程序,它在屏幕中间打印一个从000到999的“计数器”,它可以正常工作(我没有写)。问题是我想了解它是如何工作的。什么DIV和STACK的使用这个程序。这个x86汇编程序是如何工作的

程序如何去知道如何去从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 
+0

'JBE L1'是一个跳转指令,使执行在'L1:MOV AH,02h'继续执行# – Draco18s

+1

使用调试程序遍历代码可能会大大提高您对此代码执行操作的理解程度为什么。 –

回答

2

程序将如何知道如何去如从009到010,内循环是什么?

内部循环由L1标签形成到JBE L1指令。内存CNT包含正在显示的计数器。它从可执行文件初始化为零,并且与999相比递增(INC CNT),并且在低于或相等时循环。

DIV,PUSH和POP在这个程序中有什么用途?

目的是将CNT的值拆分为不同的数字并显示它们。 DIV BL除以AX除以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在屏幕上打印单个字符。

+0

谢谢,你只是让它更容易理解 – Limemist

0

该指令:

.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') 

BTW,代码的一位,你并没有问的是:

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")