汇编基础:输出寄存器值
Assembly Basics: Output register value
我刚开始学习汇编语言,我已经卡在了 "display the decimal values stored in a register on the screen" 的部分。我正在使用 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
在 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
mov ah, 00h ; display function here?
不是,单字显示功能在AH=2 / int 21h
由于您的 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
我刚开始学习汇编语言,我已经卡在了 "display the decimal values stored in a register on the screen" 的部分。我正在使用 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
在 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
mov ah, 00h ; display function here?
不是,单字显示功能在AH=2 / int 21h
由于您的 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