gpt4 book ai didi

assembly - 为什么这个汇编语言程序以相反的顺序打印十六进制数字?

转载 作者:行者123 更新时间:2023-12-02 23:21:38 26 4
gpt4 key购买 nike

我一直在学习如何编写操作系统的讲义,并开始掌握汇编语言,特别是 NASM。 (这里有讲义,感兴趣的话:https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf)

首要任务之一是编写一个程序,将 16 位十六进制数的 ASCII 表示形式打印到屏幕上。

在下面的程序中,测试编号是“0x6bf1”。该程序打印该数字,但十六进制数字相反,即“01fb6”。我不明白为什么 - 有人能给我提示吗? (顺便说一句,这不是作业)。

[org 0x7c00]            ; BIOS loads bootloader to address 0x7c00

mov dx, 0x6bf1
call print_hex
jmp $ ; Hang after printing result

print_hex:

mov cl, 0
mov bx, HEX_OUT
add bx, 2 ; To start writing after '0x'

loop:

cmp cl, 16
je finally
mov ax, dx
shr ax, cl
and ax, 0x000f
add ax, 0x30
cmp ax, 0x39
jg add_7
mov byte [bx], al
add bx, 1 ; Increment write address for the next round
add cl, 4 ; Increment bit shift for the next round
jmp loop

add_7: ; Handles letters (A-F)

add ax, 0x07
mov byte [bx], al
add bx, 1 ; Increment write address for the next round
add cl, 4 ; Increment bit shift for the next round
jmp loop


finally:

mov bx, HEX_OUT
call print_string
ret

print_string:
mov ah, 0x0e ; Set up for BIOS Teletype Routine
mov dx, bx

print_loop:
mov cl, [bx]
cmp cl, 0
je exit
mov al, [bx]
int 0x10
add bx, 1
jmp print_loop

exit:
ret

HEX_OUT: db '0x0000',0

; padding and magic BIOS number
times 510-($-$$) db 0
dw 0xaa55

最佳答案

感谢Michael Petch的评论和 Margaret Bloom你已经知道你的代码出了什么问题。解决方案是使用如下循环:

    mov  cl, 12
Loop:
mov ax, dx
shr ax, cl
...
sub cl, 4
jnb Loop
<小时/>

由于这不是家庭作业,我们可以进一步学习编写更好的代码。主循环的主体效率低下,因为您重复了许多不必要的指令。通过用 7 跳过加法,看看代码会小多少:

    mov  cl, 12
Loop:
mov ax, dx
shr ax, cl
and al, 0x0F
add al, "0"
cmp al, "9"
jng isDigit
add al, 7 ; Handles letters (A-F)
isDigit:
mov byte [bx], al
inc bx ; Increment write address for the next round
sub cl, 4
jnb Loop

请注意,我使用了 AL 而不是 AX。程序中这些点的AX高字节没有相关内容。此外,使用 AL 可以减少代码大小。使用 inc bx 而不是 add bx,1 也可以减少代码大小。

BIOS Teletype 函数以 BH 作为参数,因此输出结果时最好不要使用 BX 迭代字符串。
为什么要加载角色两次(一次在 CL 中,一次在 AL 中)?
看看我如何将字符串末尾的测试放在循环末尾附近?这样就省去了不必要的跳跃。在您将来编写的程序中,这将成为一个重要的细节。

print_string:
mov si, bx
mov ah, 0x0E ; Set up for BIOS Teletype Routine - function number
mov bh, 0 ; Set up for BIOS Teletype Routine - display page
jmp TestEnd
print_loop:
int 0x10
inc si
TestEnd:
mov al, [si]
cmp al, 0
jne print_loop
ret

关于assembly - 为什么这个汇编语言程序以相反的顺序打印十六进制数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com