如何打印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 个错误导致无法正确执行。

  1. .COM 程序从顶部开始执行,但这是您放置数据的地方。这绝对不能执行!所以要么把数据放在代码下面,要么跳过数据。
  2. 您使用的数据是字大小的,因此在迭代数据时需要将 2 加到 SI 寄存器。