Assembly 汇编基础:输出寄存器值

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,如有任何帮助,将不胜感激!:)


在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