Assembly 汇编基础:输出寄存器值
我刚开始学习汇编语言,我已经被困在“在屏幕上显示存储在寄存器中的十进制值”的部件上。我正在使用emu8086,如有任何帮助,将不胜感激!:)Assembly 汇编基础:输出寄存器值,assembly,dos,x86-16,emu8086,Assembly,Dos,X86 16,Emu8086,我刚开始学习汇编语言,我已经被困在“在屏幕上显示存储在寄存器中的十进制值”的部件上。我正在使用emu8086,如有任何帮助,将不胜感激!:) 在emu8086中,可以使用现成的宏和过程来实现此目的 例如: include 'emu8086.inc' ; Include useful macros and procedures .model small .stack .data var1 db 6 var2 db 2 var3 db 7 .code DEFINE_PRINT
在emu8086中,可以使用现成的宏和过程来实现此目的 例如:
include 'emu8086.inc' ; Include useful macros and procedures
.model small
.stack
.data
var1 db 6
var2 db 2
var3 db 7
.code
DEFINE_PRINT_NUM ; Create procedure PRINT_NUM
DEFINE_PRINT_NUM_UNS ; Create procedure PRINT_NUM_UNS
crlf proc
mov ah, 2
mov dl, 13
int 21h
mov dl, 10
int 21h
ret
crlf endp
main proc
mov ax, @data
mov ds, ax
; test output: 54321 & -11215
mov ax, 54321
call PRINT_NUM_UNS ; Print AX as unsigned number
call crlf
mov ax, 54321
call PRINT_NUM ; Print AX as signed number
call crlf
mov bl, var1
add bl, var2
add bl, var3
mov ax, bx ; AX contains the number for PRINT_NUM
xor ah, ah ; Could contain crap
call PRINT_NUM
call crlf
mov ax, 4c00h
int 21h
main endp
end main
否,单字符显示功能处于启用状态
由于BL寄存器只包含一个较小的值(9),因此它所需要的是:
mov ah, 02h
mov dl, bl
add dl, "0" ; Integer to single-digit ASCII character
int 21h
如果值变大一点但不超过99,您可以使用:
mov al, bl ; [0,99]
aam ; divide by 10: quotient in ah, remainder in al (opposite of DIV)
add ax, "00"
xchg al, ah
mov dx, ax
mov ah, 02h
int 21h
mov dl, dh
int 21h
不使用AAM
指令的解决方案:
mov al, bl ; [0,99]
cbw ; Same result as 'mov ah, 0' in this case
mov dl, 10
div dl ; Divides AX by 10: quotient in al, remainder in ah
add ax, "00"
mov dx, ax
mov ah, 02h
int 21h
mov dl, dh
int 21h
@MichaelPetch我试过了,但没能理解。我在寻找一个简单易懂的答案!:(@MichaelPetch所以如果不先将寄存器值转换成字符串,我就无法打印它?即使它是十六进制、二进制或任何其他基?我确实理解用余数转换它的方法,只是想知道是否还有其他方法?我只想在屏幕上显示寄存器内的值!寄存器或内存中的整数无论您如何编写源代码,都始终是二进制的。例如,
0Fh
和15
汇编到相同的位模式。不幸的是,我得到了64位不支持的“aam”mode@AntoninGAVREL这篇文章介绍了emu8086环境,AAM
指令应该在该环境下工作不使用AAM的计算。
mov al, bl ; [0,99]
aam ; divide by 10: quotient in ah, remainder in al (opposite of DIV)
add ax, "00"
xchg al, ah
mov dx, ax
mov ah, 02h
int 21h
mov dl, dh
int 21h
mov al, bl ; [0,99]
cbw ; Same result as 'mov ah, 0' in this case
mov dl, 10
div dl ; Divides AX by 10: quotient in al, remainder in ah
add ax, "00"
mov dx, ax
mov ah, 02h
int 21h
mov dl, dh
int 21h