在装配 8086 中打印数字



我使用我在互联网上找到的一些指令编写了这段代码,以转换一些由汇编程序计算然后存储在寄存器或存储中的数字。我无法弄清楚如何打印包含转换数字的SI。我想我需要找到一种方法回到 SI,并首先保存数据。有人有什么想法吗?

;CONVERTING DIGITS 

MOV  AX, HORIZONTAL
MOV  BX, 10         ;DIGITS ARE EXTRACTED DIVIDING BY 10.
MOV  CX, 0          ;COUNTER FOR EXTRACTED DIGITS.
CYCLE1:       
MOV  DX, 0          ;REMAINDER OF DIV WILL BE STORED HERE
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           ;TO SEE IF NUMBER IS
JNE  CYCLE1         ;NOT ZERO, LOOP BACK. 
;NOW RETRIEVING PUSHED DIGITS.
MOV  SI, OFFSET HORIZONTAL  
MOV  TMP1, CX
CYCLE2:  
POP  DX        
ADD  DL, 48    ;CONVERT DIGIT TO CHARACTER.
MOV  [SI], DL
INC  SI
LOOP CYCLE2

MOV AH,9            ; print string
MOV DX, OFFSET SI
INT 21h

你的代码几乎是完美的,它只需要另一个字符串变量,在 EMU 中复制粘贴下一个代码并运行:

.model small
.stack 100h
.data
HORIZONTAL DW 61503  ;◄■■ TEST NUMBER.
RESULT     DB 6 DUP('$') ;◄■■ VARIABLE FOR THE STRING ☻.
TMP1       DW ?
.code
  mov  ax, @data
  mov  ds, ax
;CONVERTING DIGITS ( ▼ YOUR CODE ▼ ).
MOV  AX, HORIZONTAL
MOV  BX, 10         ;DIGITS ARE EXTRACTED DIVIDING BY 10.
MOV  CX, 0          ;COUNTER FOR EXTRACTED DIGITS.
CYCLE1:       
MOV  DX, 0          ;REMAINDER OF DIV WILL BE STORED HERE
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           ;TO SEE IF NUMBER IS
JNE  CYCLE1         ;NOT ZERO, LOOP BACK. 
;NOW RETRIEVING PUSHED DIGITS.
MOV  SI, OFFSET RESULT ;◄■■ VARIABLE FOR THE STRING.
MOV  TMP1, CX
CYCLE2:  
POP  DX        
ADD  DL, 48    ;CONVERT DIGIT TO CHARACTER.
MOV  [SI], DL
INC  SI
LOOP CYCLE2

MOV AH,9            ; print string
MOV DX, OFFSET RESULT ;◄■■ VARIABLE FOR THE STRING.
INT 21h
  mov  ax, 4c00h
  int  21h
对于将

字符串打印到标准输出的 DOS 服务 09h,DS:DX应包含指向以 $ 结尾的字符串的指针。因此,您有两个任务来打印字符串:

  1. 字符串末尾添加一个 $ 字符以标记其结尾。
  2. DX寄存器中放置指向字符串开头的指针。

您当前的代码是错误的,因为它不执行这两件事中的任何一项。请记住,虽然SI寄存器确实包含一个指针,但在循环完成后,它包含一个指向字符串末尾的指针,这不是您想要的。您需要一个指向字符串开头的指针。幸运的是,HORIZONTAL是字符串缓冲区开头的偏移量,因此您可以使用它!(段寄存器DS不需要更改。

因此,您的代码需要看起来像:

; Terminate string
mov  BYTE PTR [si], '$'
; Print string
mov  dx, OFFSET HORIZONTAL
mov  ah, 09h
int  21h

最新更新