gpt4 book ai didi

assembly - x86 NASM 程序集 - 堆栈问题

转载 作者:行者123 更新时间:2023-12-02 18:57:37 26 4
gpt4 key购买 nike

我正在开发一个程序,只需接受用户的输入两次,然后稍后将结果打印到标准输出。我遇到的问题是,当结果从输入中断(在eax中)返回时,我将其插入堆栈以供稍后使用。我对第二个用户输入再次执行此操作。

到目前为止我的代码是:

%include "system.inc" ; used for renaming of interrupts (sys.write and sys.read)

section .data
greet: db 'Hello!', 0Ah, 'What is your name?', 0Ah
greetL: equ $-greet ;length of string
colorQ: db 'What is your favorite color?', 0Ah
colorL: equ $-colorQ
suprise1: db 'No way '
suprise1L: equ 7
comma: db ', '
commaL: equ $-comma
suprise3: db ' is my favorite color, too!', 0Ah
suprise3L: equ $-suprise3


section .bss

name: resb 50
color: resb 50

section .text

global _start
_start:


greeting:
mov eax, 4
mov ebx, 1
mov ecx, greet
mov edx, greetL
sys.write

getname:
mov eax, 3
mov ebx, 0
mov ecx, name
mov edx, 50
sys.read

xor ecx, ecx
mov eax, ecx
push ecx

askcolor:
mov eax, 4
mov ebx, 1
mov ecx, colorQ
mov edx, colorL
sys.write

getcolor:
mov eax, 3
mov ebx, 0
mov ecx, color
mov edx, 50
sys.read

xor ebx, ebx
mov ebx, eax
push ebx


thesuprise:
mov eax, 4
mov ebx, 1
mov ecx, suprise1
mov edx, suprise1L
sys.write

xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ecx
sub ecx, 1
mov edx, ecx

mov eax, 4
mov ebx, 1
mov ecx, name
mov edx, edx
sys.write

mov eax, 4
mov ebx, 1
mov ecx, comma
mov edx, commaL
sys.write

xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ebx
sub ebx, 1
mov edx, ebx

mov eax, 4
mov ebx, 1
mov ecx, color
mov edx, edx
sys.write

mov eax, 4
mov ebx, 1
mov ecx, suprise3
mov edx, suprise3L
sys.write

done:

mov eax, 1
mov ebx, 0
sys.exit

我在输出中遇到了严重的间距问题,很可能是因为当我推送/弹出它时我如何处理eax中返回的值。有什么办法可以解决这个问题/我做错了吗?

最佳答案

greeting:
mov eax, 4
mov ebx, 1
mov ecx, greet
mov edx, greetL
sys.write

getname:
mov eax, 3
mov ebx, 0
mov ecx, name
mov edx, 50
sys.read

我不知道这些 sys.writesys.read 宏将为您做什么,但它们很可能会加载 eax 在使用 int 0x80 调用系统调用之前使用正确的值,因此您可能不需要自己执行此操作。否则的话,它们就没有什么意义了……

(但这不是问题;43writeread 的正确系统调用号分别在 32 位 Linux x86 上。)

实际的问题可能在这里:

    xor ecx, ecx
mov eax, ecx
push ecx

这看起来是错误的:您将 ecx 与自身进行异或运算,这将其设置为零。然后,您将 ecx(现在为 0)分配给 eax(系统调用的结果),因此系统调用的结果被丢弃。然后你将 ecx (仍然是 0)压入堆栈。

更进一步,你有:

    xor ebx, ebx
xor ecx, ecx
xor edx, edx
pop ecx
sub ecx, 1
mov edx, ecx

...这也很奇怪:当您刚要重新加载时,为什么使用 xor 指令将 ecxedx 为零他们从其他地方得到了一些进一步的说明?

<小时/>

我猜您可能只是将 mov 的操作数搞错了。而不是:

    xor ecx, ecx
mov eax, ecx
push ecx

...如果你说:

    xor ecx, ecx
mov ecx, eax
push ecx

....您至少可以成功地将 eax 中的值(系统调用的返回代码)推送到堆栈上,尽管直接说会简单得多:

    push eax
<小时/>

最后:你问“名称”问题,并(假设上面的问题已修复)将结果长度压入堆栈。然后你问“颜色”问题,并将结果长度压入堆栈。

但是然后你使用从堆栈中弹出的第一个值打印“名称”惊喜,这是你从“颜色”问题中保存的长度。 (堆栈是后进先出!)然后,您可以使用“名称”问题的长度来打印“颜色”惊喜。

关于assembly - x86 NASM 程序集 - 堆栈问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8003607/

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