gpt4 book ai didi

汇编语言循环不工作

转载 作者:行者123 更新时间:2023-12-04 05:32:02 25 4
gpt4 key购买 nike

我是汇编语言的初学者。我想用空格打印 1-9。我想这样打印

1 2 3 4 5 6 7 8 9

这是我的代码,我正在使用 ma​​sm 此代码挂起 命令提示符

为什么这不起作用?

DATA_SEG SEGMENT
DATA_SEG ENDS
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG , DS:DATA_SEG
MAIN PROC FAR
MOV AH,02
MOV AX,'0'
MOV CX,10
L1:
MOV DX,AX
INT 21H
INC AX
LOOP L1

MOV AX,4C00H
INT 21H
MAIN ENDP
CODE_SEG ENDS
END MAIN

最佳答案

MOV AH,02
MOV AX,'0' ; sets ah=0. this is your bug (there may be others).

以下循环打印所有数字,但不留空格。我会把它留给你。 (编辑:哎呀,这会打印从 0..9 开始的数字,因为这就是您的代码在系统调用后对 inc 执行的操作,并且以“0”开头。显然以 “1” 开头.)

    MOV   AH, 2
mov dl, '0'
.l1:
INT 21H
INC dl
cmp dl, '9'
jle .l1

假设 int 21/ah=2 打印 dl 中的字符。 int 21 不会破坏任何寄存器 ( except the return value in al ),因此您不需要在循环内 mov dx, ax。 (编辑:是的,因为如果一次打印一个字节,则需要交替使用空格和数字)。

使用 AH=09h 编写整个字符串意味着您可以高效地构造它,然后打印整个字符串。例如

    ;; Not debugged or tested (I don't keep DOS around...)
;; So I may have gotten some 2-character constants in the wrong order
sub sp, 22 ; reserve space (slightly more than necessary because I didn't debug or even test this)
mov di, sp
mov ax, '0 '
.l1:
stosw ; store digit and trailing space into [edi+=2]
inc al
cmp al, '9'
jle .l1

; note that NASM doesn't process \ escapes, but MASM does
mov word [di], '\n$' ; newline and DOS end-of-string marker
mov dx, sp ; dx=input param = start of our buffer
; this only works if DS=SS, I guess. Yay segments.
mov ah, 09h ; DOS write string syscall
int 21h
...
add sp, 22 ; release the stack buffer

...

请注意,与大多数 asm 示例不同,此代码不使用静态缓冲区(bss 或数据部分)。这可能是因为分割。不要花太多时间学习段,它们对现代操作系统下的现代程序没有用。查看维基百科。

另请注意,它不使用loop,因为that's slow .

我本可以使用 push 在堆栈上创建字符串,但这可能更令人困惑,而且您永远不会看到编译器这样做。有了推送,它会像

    push   '\n$'
mov ax, '9 '
.l1:
push ax ; like stosw in reverse, but with SP instead of DI
dec al
cmp al, '0'
jge .l1

... make the system call with dx=sp

不过,这会在 9 之后留下一个尾随空格。

关于汇编语言循环不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35740777/

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