汇编基础知识:输出寄存器值

5 assembly dos x86-16 emu8086

我刚刚开始学习汇编语言,我已经陷入了“在屏幕上显示存储在寄存器中的十进制值”的部分。我使用 emu8086,任何帮助将不胜感激!:)

.model small  ;Specifies the memory model used for program to identify the size of code and data segments

org 100h      ;allocate 100H memory locations for stack

.data         ;the segment of the memory to declare/initialze the variables

var1 db 0006
var2 db 0002
var3 db 0001


.code           ;start of the code segment

main proc       ;start of the first procedure

mov bl, var1
add bl, var2
add bl, var3


mov ah, 00h   ; display  function here?
mov dl, bl    ; output the bl register's value?  
int 21h

mov ah, 4ch  ;exit DOS function                                           
int 21h

endp         ;end of the first procedure

end main     ;end of the complete assembly program

ret
Run Code Online (Sandbox Code Playgroud)

Sep*_*and 5

mov ah, 00h   ; display  function here?
Run Code Online (Sandbox Code Playgroud)

否,单字符显示功能在AH=2 /int 21h

由于您的 BL 寄存器仅包含一个很小的值 (9),因此它所需要的就是:

mov  ah, 02h
mov  dl, bl
add  dl, "0"   ; Integer to single-digit ASCII character
int  21h
Run Code Online (Sandbox Code Playgroud)

如果值变得更大但不超过 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
Run Code Online (Sandbox Code Playgroud)

不使用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
Run Code Online (Sandbox Code Playgroud)