这个 x86 汇编程序是如何工作的
How does this x86 assembly program work
这是一个 x86 asm 程序,它在屏幕中间打印从 000 到 999 的 'counter',效果很好(我没有写)。问题是我试图了解它是如何工作的。 DIV
和 STACK 在 THIS 程序中的用途。
程序如何知道如何去从009到010。内循环是什么?
我知道它是如何清屏和打印到屏幕中间的,我知道时钟延迟功能。
DIV
、PUSH
和 POP
在该计划中的作用是什么?
基本上我是在尝试追踪它并了解所使用的功能。我还是个初学者,请帮忙。谢谢。
这是代码:
.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
这个指令:
.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")
How will the program know how to go e.g. from 009 to 010, what's the inner loop ?
从L1
标签到JBE L1
指令形成内循环。内存 CNT
保存正在显示的计数器。它从可执行文件初始化为零并递增 (INC CNT
),与 999 相比并在它低于或等于时循环。
What purpose does DIV, PUSH and POP serve in this program ?
目的是将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打印单个字符到屏幕。
这是一个 x86 asm 程序,它在屏幕中间打印从 000 到 999 的 'counter',效果很好(我没有写)。问题是我试图了解它是如何工作的。 DIV
和 STACK 在 THIS 程序中的用途。
程序如何知道如何去从009到010。内循环是什么?
我知道它是如何清屏和打印到屏幕中间的,我知道时钟延迟功能。
DIV
、PUSH
和 POP
在该计划中的作用是什么?
基本上我是在尝试追踪它并了解所使用的功能。我还是个初学者,请帮忙。谢谢。
这是代码:
.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
这个指令:
.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")
How will the program know how to go e.g. from 009 to 010, what's the inner loop ?
从L1
标签到JBE L1
指令形成内循环。内存 CNT
保存正在显示的计数器。它从可执行文件初始化为零并递增 (INC CNT
),与 999 相比并在它低于或等于时循环。
What purpose does DIV, PUSH and POP serve in this program ?
目的是将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打印单个字符到屏幕。