gpt4 book ai didi

assembly - 如何在屏幕上显示一个数字并使用 DOS x86 程序集休眠一秒钟?

转载 作者:行者123 更新时间:2023-12-04 18:48:31 25 4
gpt4 key购买 nike

我正在使用 NASM 16 位。我正在尝试做一个简单的汇编代码,打印从 0 到 255 的数字,每个数字之间的间隔为 1 秒。这是我到目前为止:

[bits 16]

mov ax,cs
mov ds,ax
mov cx,255
mov ax,0

myloop:
;print in screen ax value
;wait 1 second
inc ax

loop myloop

我不确定如何在屏幕上打印 ax 的值,以及如何等待 1 秒(将它们放在代码的注释中)。

最佳答案

在段 0 偏移 46Ch(或者在段 40h,offs 6Ch)处有一个 4 字节计数器,由 PC BIOS 维护和更新。它每秒增加 18.2 次。在这个计数器的最低字节或字中计算 18 个变化可能是等待大约一秒钟的最简单方法:

mov  ax, 0
mov ds, ax
mov cx, 18
mov bx, [46Ch]
WaitForAnotherChange:
NoChange:
mov ax, [46Ch]
cmp ax, bx
je NoChange
mov bx, ax
loop WaitForAnotherChange

要打印十进制数,您需要将二进制数转换为十进制数,获取单个数字并打印它们。您将数字除以 10 并收集余数。例如。:

123:
123/10:商 12,余数 3
12/10:商1,余数2
1/10:商0,余数1

通过反复除以 10,您可以以相反的顺序获得余数中的各个数字:3,2,1。然后使用 DOS int 21h function 2 打印它们(将 2 加载到 AH 中,将字符的 ASCII 代码加载到 DL 中,执行 int 21h )。

另一种非常适合您的问题的变体是使用 DAA直接以十进制递增数字而不进行任何转换的指令。

以下是这一切的方法:
; file: counter.asm
; assemble: nasm.exe counter.asm -f bin -o counter.com

bits 16
org 0x100

mov ax, 0 ; initial number
mov cx, 256 ; how many numbers

NextNumber:
%if 1 ; change to 0 to use the DAA-based method
push ax

mov dx, 0
div word [ten]
push dx

mov dx, 0
div word [ten]
push dx

mov dx, 0
div word [ten]
push dx

pop dx
call PrintDigit
pop dx
call PrintDigit
pop dx
call PrintDigit

pop ax

call PrintNewLine
call Wait1s

inc ax
%else
mov dl, ah
call PrintDigit

mov dl, al
shr dl, 4
call PrintDigit

mov dl, al
and dl, 0Fh
call PrintDigit

call PrintNewLine
call Wait1s

add al, 1
daa
adc ah, 0
%endif

loop NextNumber
ret

PrintDigit:
pusha
mov ah, 2
add dl, '0'
int 21h
popa
ret

PrintNewLine:
pusha
mov dx, CRLF
mov ah, 9
int 21h
popa
ret

Wait1s:
pusha
push ds

mov ax, 0
mov ds, ax

mov cx, 18
mov bx, [46Ch]
WaitForAnotherChange:
NoChange:
mov ax, [46Ch]
cmp ax, bx
je NoChange
mov bx, ax
loop WaitForAnotherChange

pop ds
popa
ret

ten dw 10
CRLF db 13,10,"$"

如果您不喜欢前导零或最后 1 秒的延迟,您可以有条件地跳过它们。

下载描述每条指令如何工作的 Intel 和/或 AMD x86 CPU 手册。阅读它们。另外,下载 Ralf Brown's Interrupt List ,它描述了每个 BIOS 和 DOS 功能。您需要了解其中的一些才能进行 I/O。还有 HelpPCTechHelp方便地描述了许多 BIOS 和 DOS 的东西,例如 BIOS Data Area上述计数器所在的位置。

关于assembly - 如何在屏幕上显示一个数字并使用 DOS x86 程序集休眠一秒钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971405/

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