- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这里我尝试了在 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,而是打印值 10d
的 ascii
字符。我是汇编语言
的新手。那么如何打印 0 到 100 的十进制数字呢?
最佳答案
解决您的问题的正确且通用的解决方案是将数字转换为字符串。为了向您展示如何执行此操作,我对您的代码进行了下一步更改:
NUM
的类型,从DB
更改为DW
(number2string
需要,它会容纳更大的数字)。numstr
,将NUM
转换为字符串。lbk
(仅在每个数字后换行)。number2string
,用于将AX中的数字转换为SI指向的字符串(这是最重要的)。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
从现在开始,您可以使用 number2string
和 dollars
来显示数字。
关于assembly - 如何在emu 8086中用汇编语言打印0到100?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605815/
我正在开发一个简单的java应用程序,它应该利用蓝牙发送数据。问题是,在编译时,我收到一个未检测到 BluetoothStack 的异常,因为我没有蓝牙设备。我听说 bluecove 的 jsr 82
我正在使用此命令从命令行向我的模拟器发送短信: adb emu sms send 8888 Hello Android 问题是命令并不总是有效;没有错误消息,但 SMS 未传送到模拟器。 例如,我执行
在下面的代码中,我尝试将 count 中的值转换为二进制,然后显示它。该代码似乎不起作用,并且在应该显示时仅显示 1,例如 1000 表示 8,但它为每个值显示一个。关于我应该改变或改进我的代码有什么
我最近下载了 Emu OS(一个 Linux 发行版)并将其安装在 virtual box 中。一切正常,但我无法在模拟器中实际运行 rom。我尝试了一个 .zip 格式的 GBC rom,并将其复制
我正在编写代码以在汇编中将十六进制 (A-F) 转换为十进制。我设法在 8086 emu 上写了它,但我需要它用于 linux。我需要帮助。 该代码在 8086 模拟器 n windows 上工作绝对
我的应用程序适用于 Google Apis 17。我想在启动模拟器后设置 gps 位置。 我试着按照 how-to-emulate-gps-location-in-the-android-emulat
我刚刚下载了最新的 Android 版 Mono (v4.0),我正在尝试将测试应用程序加载到 14 级 API 模拟器中。在 Visual Studio 10 和 Monodevelop 中,我在打
A recent ember-data blog update建议查看ember-model , ember-restless , 和 emu作为与传统 API 通信的 ember-data 的替代品
在 Windows Phone 8.1 512MB RAM 模拟器上,我的 WinJS 应用程序有时会出现奇怪的错误。我无法在其他模拟器实例或设备上重现它。 执行遍历 promise 链并完成以下 r
这是我在 Stack Overflow 上的第一个问题,如果我问错地方或搞砸了,请提前道歉。 我有这个项目,我正在为该项目重新利用旧的 android 平板电脑。我需要制作一个始终在平板电脑上打开的应
每当我尝试从 Android 设备管理器启动我的模拟器时出现此错误。任何解决方案? 最佳答案 更新:在此主题上进行了一些额外的试验和错误之后,我了解到对于 AMD,我需要引用下图从 Windows 功
我正在尝试使用 native native 进行学校项目,但在 cmd 中执行以下命令时:emulator -version 他向我返回了此错误: [4640]:ERROR:android/andro
在 Android Studio 上,我不断收到此警告: [12728]:WARNING:./android/base/files/IniFile.cpp:158:Failed to process
我是一名优秀的程序员,十分优秀!