我使用我在互联网上找到的一些指令编写了这段代码,以转换由汇编程序计算出来的数字,然后存储在寄存器或存储器中。我无法弄清楚如何打印包含转换数字的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
答案 0 :(得分:1)
对于DOS服务09h,它将字符串输出到标准输出,DS:DX
应包含指向$ -terminated字符串的指针。所以你有两个任务来打印字符串:
DX
寄存器中放置一个指向字符串开头的指针。您当前的代码是错误的,因为它不会执行这两项任务。请记住,虽然SI
寄存器 包含指针,但在循环完成后,它包含指向字符串 end 的指针,而不是你想要什么。你需要一个指向字符串开头的指针。幸运的是,HORIZONTAL
是字符串缓冲区开头的偏移量,所以你可以使用它! (段寄存器DS
不需要更改。)
因此,您的代码需要看起来像是:
; Terminate string
mov BYTE PTR [si], '$'
; Print string
mov dx, OFFSET HORIZONTAL
mov ah, 09h
int 21h
答案 1 :(得分:0)
你的代码几乎是完美的,它只需要字符串的另一个变量,在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