如何打印emu8086寄存器的内容?
How to print the contents of a register in emu8086?
include 'emu8086.inc'
#make_com#
org 100h
s1 dw 50,60,70,80,90,100,120,130,140,160,170,190,190,220,250,270,300
MOV SI,0
MOV CX,16
s2:
MOV AX,s1[SI]
s3:
INC SI
CMP AX,100
JBE s4
JA s5
s4:
PRINTf AX
JMP s3
s5:
CMP AX,200
JB s6
JA s7
s6:
PRINTf AX
JMP s3
s7:
PRINTf AX
JMP s3
END
;printf AX doesn't work and i want to print the contents of AX
您可以按原样显示 AX,但您会在屏幕上看到奇怪的字符。需要一个从二进制 (AX) 转换为字符串的过程。接下来的代码将一个数字放入 AX,将 AX 转换为字符串,然后显示该字符串。您可以在以后的程序中使用过程 number2string。将下一个代码复制粘贴到 EMU8086 中 运行 :
.stack 100h
;------------------------------------------
.data
str db 6 dup('$') ;STRING TO STORE NUMBER.
;------------------------------------------
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;CONVERT NUMBER TO STRING.
mov ax, 10382 ;ANY NUMBER.
call number2string ;CONVERT AX. RESULT IN "STR".
;DISPLAY STRING.
mov ah, 9
mov dx, offset str ;NUMBER CONVERTED.
int 21h
;WAIT FOR USER TO PRESS ANY KEY.
mov ah,7
int 21h
;FINISH PROGRAM.
mov ax, 4c00h
int 21h
;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN AX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING.
proc number2string
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
mov si, offset str
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
多一点解释:对于您以后的程序,过程 number2string 需要一个名为 "str" 的数据段中的变量。正如你在代码中看到的,"str" 的长度为 6,因为 AX 可以容纳 5 位或更少的数字,并且如果要显示它,字符串需要 '$' 符号,这就是长度为 6 的原因。 number2string 的参数必须放在 AX 上。当然,你可以改变变量名(str)和使用的寄存器(AX)。
;printf AX doesn't work and i want to print the contents of AX
您没有向我们展示 PRINTf 应该做什么。所以你所有的 PRINTf AX
宏调用都可以。
但是您的程序确实有 2 个错误导致无法正确执行。
- .COM 程序从顶部开始执行,但这是您放置数据的地方。这绝对不能执行!所以要么把数据放在代码下面,要么跳过数据。
- 您使用的数据是字大小的,因此在迭代数据时需要将 2 加到 SI 寄存器。
include 'emu8086.inc'
#make_com#
org 100h
s1 dw 50,60,70,80,90,100,120,130,140,160,170,190,190,220,250,270,300
MOV SI,0
MOV CX,16
s2:
MOV AX,s1[SI]
s3:
INC SI
CMP AX,100
JBE s4
JA s5
s4:
PRINTf AX
JMP s3
s5:
CMP AX,200
JB s6
JA s7
s6:
PRINTf AX
JMP s3
s7:
PRINTf AX
JMP s3
END
;printf AX doesn't work and i want to print the contents of AX
您可以按原样显示 AX,但您会在屏幕上看到奇怪的字符。需要一个从二进制 (AX) 转换为字符串的过程。接下来的代码将一个数字放入 AX,将 AX 转换为字符串,然后显示该字符串。您可以在以后的程序中使用过程 number2string。将下一个代码复制粘贴到 EMU8086 中 运行 :
.stack 100h
;------------------------------------------
.data
str db 6 dup('$') ;STRING TO STORE NUMBER.
;------------------------------------------
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;CONVERT NUMBER TO STRING.
mov ax, 10382 ;ANY NUMBER.
call number2string ;CONVERT AX. RESULT IN "STR".
;DISPLAY STRING.
mov ah, 9
mov dx, offset str ;NUMBER CONVERTED.
int 21h
;WAIT FOR USER TO PRESS ANY KEY.
mov ah,7
int 21h
;FINISH PROGRAM.
mov ax, 4c00h
int 21h
;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN AX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING.
proc number2string
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
mov si, offset str
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
多一点解释:对于您以后的程序,过程 number2string 需要一个名为 "str" 的数据段中的变量。正如你在代码中看到的,"str" 的长度为 6,因为 AX 可以容纳 5 位或更少的数字,并且如果要显示它,字符串需要 '$' 符号,这就是长度为 6 的原因。 number2string 的参数必须放在 AX 上。当然,你可以改变变量名(str)和使用的寄存器(AX)。
;printf AX doesn't work and i want to print the contents of AX
您没有向我们展示 PRINTf 应该做什么。所以你所有的 PRINTf AX
宏调用都可以。
但是您的程序确实有 2 个错误导致无法正确执行。
- .COM 程序从顶部开始执行,但这是您放置数据的地方。这绝对不能执行!所以要么把数据放在代码下面,要么跳过数据。
- 您使用的数据是字大小的,因此在迭代数据时需要将 2 加到 SI 寄存器。