gpt4 book ai didi

linux - NASM 一次打印一个字符

转载 作者:太空狗 更新时间:2023-10-29 11:39:26 26 4
gpt4 key购买 nike

为什么这个程序没有打印到屏幕上,我是不是在 INT 80 命令上遗漏了什么?

  section .bss

section .data
hello: db "Hello World",0xa ;10 is EOL

section .text
global _start

_start:

mov ecx, 0; ; int i = 0;
loop:
mov dl, byte [hello + ecx] ; while(data[i] != EOF) {
cmp dl, 0xa ;
je exit ;
mov ebx, ecx ; store conetents of i (ecx)

; Print single character
mov eax, 4 ; set sys_write syscall
mov ecx, byte [hello + ebx] ; ...
mov edx, 1 ; move one byte at a time
int 0x80 ;

inc ebx ; i++
mov ecx, ebx ; move ebx back to ecx
jmp loop ;

exit:
mov eax, 0x01 ; 0x01 = syscall for exit
int 0x80 ;

添加

我的生成文件:

sandbox: sandbox.o
ld -o sandbox sandbox.o

sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst

修改后的代码:

section .bss

section .data
hello: db "Hello World",0xa ;10 is EOL

section .text
global _start

_start:

mov ecx, 0; ; int i = 0;
while:
mov dl, byte [hello + ecx] ; while(data[i] != EOF) {
cmp dl, 0xa ;
je exit ;
mov ebx, ecx ; store conetents of i (ecx)

; Print single character
mov eax, 4 ; set sys_write syscall
mov cl, byte [hello + ebx] ; ...
mov edx, 1 ; move one byte at a time
int 0x80 ;

inc ebx ; i++
mov ecx, ebx ; move ebx back to ecx
jmp while ;

exit:
mov eax, 0x01 ; 0x01 = syscall for exit
int 0x80 ;

最佳答案

它不打印的原因之一是因为 ebx 应该保存值 1 来指定 stdin,另一个是因为 sys_write将指针(字符串的地址)作为参数,而不是实际的字符值。

无论如何,让我向您展示一种构建程序的更简单方法:

section .data

SYS_EXIT equ 1
SYS_WRITE equ 4
STDOUT equ 1
TRAP equ 0x80
NUL equ 0

hello: db "Hello World",0xA,NUL ; 0xA is linefeed, terminate with NUL

section .text
global _start

_start:
nop ; for good old gdb
mov ecx, hello ; ecx is the char* to be passed to sys_write

read:
cmp byte[ecx], NUL ; NUL indicates the end of the string
je exit ; if reached the NUL terminator, exit

; setup the registers for a sys_write call
mov eax, SYS_WRITE ; syscall number for sys_write
mov ebx, STDOUT ; print to stdout
mov edx, 1 ; write 1 char at a time
int TRAP; ; execute the syscall

inc ecx ; increment the pointer to the next char
jmp read ; loop back to read

exit:
mov eax, SYS_EXIT ; load the syscall number for sys_exit
mov ebx, 0 ; return a code of 0
int TRAP ; execute the syscall

像我一样用 NUL 终止你的字符串会更简单,或者你也可以做 $-hello 来在编译时得到它的长度。我还在循环中的每次迭代中为 sys_write 设置寄存器(就像您所做的那样),因为 sys_write 不会保留所有寄存器。

关于linux - NASM 一次打印一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8426491/

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