在“汇编”中打印一个单词 10 次

Print a word 10 times in Assembly

提问人:yoyo 提问时间:11/27/2018 最后编辑:Peter Cordesyoyo 更新时间:10/12/2023 访问量:390

问:

我需要在汇编中打印一个单词 10 次,但我在以前版本的问题中的代码只打印 1 次。

另外,如何删除空字节?

这是一个固定版本,如果内置到静态可执行文件中,则打印 10 次,因此在此代码运行之前 EAX 的高字节为零。

section .text
global _start       ;must be declared for using gcc
_start:                     ;tell linker entry point
mov si,10
l1:
mov dl, len    ;message length
mov ecx, msg    ;message to write
mov bl, 1       ;file descriptor (stdout)
mov al, 4       ;system call number (sys_write)
int 0x80        ;call kernel
dec si
JNZ l1         
mov al, 1       ;system call number (sys_exit)
int 0x80        ;call kernel

section .data

msg db  'test',0xa  ; string
len equ $ - msg         ;length of   string
程序集 x86

评论

0赞 Ronald 11/27/2018
嗯,在我看来,您覆盖了 ECX 的内容。
3赞 melpomene 11/27/2018
ecx不能两者兼而有之。10msg
0赞 yoyo 11/27/2018
我已将计数器更改为 cl 并使用 JNZ,但现在它变成了无限循环
2赞 Jester 11/27/2018
cl是 的低 8 位。使用 或 .ecxesiedi
1赞 Peter Cordes 11/28/2018
现在,代码依赖于 EAX 的前 3 个字节在代码运行之前为零。这在静态可执行文件中是正确的,但在其他任何地方通常都不是一个安全的假设。而且它不是自我纠正的:一个错误的呼叫号码将返回,然后你只会替换它的低字节,从而导致相同的错误。此外,IDK 为什么您使用 16 位部分寄存器,它只需要额外的代码大小和操作数大小前缀。_start-ENOSYS

答:

1赞 Zahraa Alqassab 10/11/2023 #1

我不知道我的答案是否会很有帮助,但我确实创建了一个运行 10 次的循环,这与您的有点不同。这是 Linux 的 64 位代码,与使用 32 位系统调用的问题不同。

global _start

section .text

_start:
    mov rbx, 10

loop:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msglen
    syscall
    dec rbx
    jnz loop
    
    mov rax, 60
    mov rdi, 0
    syscall

section .rodata
msg: db "Hello", 10
msglen: equ $ - msg