gpt4 book ai didi

assembly - 如何在emu 8086中用汇编语言打印0到100?

转载 作者:行者123 更新时间:2023-12-02 03:54:53 24 4
gpt4 key购买 nike

这里我尝试了在 emu8086 中打印 10 到 0 的十进制数字。

     .MODEL SMALL
.STACK 100H
.DATA
NUM DB 58D

.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX


START:
CMP NUM,48D
JGE PRINT
JMP END_


PRINT:
MOV AH,2
MOV DL,NUM
INT 21H
DEC NUM
JMP START

END_:
MOV AH,4CH
MAIN ENDP
END MAIN

它在打印 9 到 0 时工作正常,但它不是打印 10,而是打印值 10dascii 字符。我是汇编语言的新手。那么如何打印 0 到 100 的十进制数字呢?

最佳答案

解决您的问题的正确且通用的解决方案是将数字转换为字符串。为了向您展示如何执行此操作,我对您的代码进行了下一步更改:

  • 更改了NUM的类型,从DB更改为DW(number2string需要,它会容纳更大的数字)。
  • 添加变量numstr,将NUM转换为字符串。
  • 添加了变量lbk(仅在每个数字后换行)。
  • 添加了proc number2string,用于将AX中的数字转换为SI指向的字符串(这是最重要的)。
  • 添加了 proc dollars,以用美元符号填充 numstr(需要显示,并在转换下一个数字之前清除字符串)。

这是显示从 0 到 100 的数字的代码(注释将帮助您理解它):

     .MODEL SMALL
.STACK 100H
.DATA
NUM DW ?
lbk db 13,10,'$' ;LINE BREAK.
numstr db '$$$$$' ;STRING FOR 4 DIGITS.

.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX

MOV NUM, 0 ;FIRST NUMBER.
START:
CMP NUM, 100 ;IF NUM <= 100...
JBE PRINT ;...DISPLAY NUM.
JMP END_

PRINT:
; MOV AH,2 ;THIS CODE
; MOV DL,NUM ;DISPLAYS
; INT 21H ;ONE CHAR ONLY.

;CONVERT NUMBER TO STRING.
mov si, offset numstr
mov ax, num
call number2string ;RETURNS NUMSTR.

;DISPLAY STRING.
mov ah, 9
mov dx, offset numstr
int 21h

;DISPLAY LINE BREAK.
mov ah, 9
mov dx, offset lbk
int 21h

INC NUM ;NUM++.
JMP START

END_:
MOV Ax,4C00H
int 21h
MAIN ENDP

;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : AX = NUMBER TO CONVERT.
; SI = POINTING WHERE TO STORE STRING.

number2string proc
call dollars ;FILL STRING WITH $.
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.
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2

ret
number2string endp

;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : SI = POINTING TO STRING TO FILL.

proc dollars
mov cx, 5
mov di, offset numstr
dollars_loop:
mov bl, '$'
mov [ di ], bl
inc di
loop dollars_loop

ret
endp

;------------------------------------------

END MAIN

从现在开始,您可以使用 number2stringdollars 来显示数字。

关于assembly - 如何在emu 8086中用汇编语言打印0到100?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com