对于我的项目工作,我测试了一个代码片段。而且我发现这个代码片段由于使用堆栈而出现分段错误。但是,我必须使用堆栈来解决它。任何人都可以帮我找出问题所在吗?我的程序将显示字符串变量的第二个字符。我的代码片段如下:
section.data
string db "test",10,0
msg2 db "%c",10,0
main:
xor eax,eax
mov eax, string
mov ebx,1 ; suppose I want to get the second character of string. SO I store the index of that character in ebx
pusha
push eax
push ebx
add esp,8
popa
pop dword[ebx] ; **I assume that this following 3 lines arise segmentation fault**
pop eax ;
mov bl,[eax+ebx] ; I want to move the fisrt character to BL using the index value stored in ebx which i popped just.
pusha
push ebx
call putchar
add esp,4
popa
pusha
push msg2
call printf
add esp,4
popa
在这里,为了您的善意考虑,我想明确说明此代码片段的目的是了解如何操作堆栈。
在这里,@nrz 最近让我了解了以下代码,我在这里编辑了上面的代码:
section.data
string db "test",10,0
msg2 db "%c",10,0
main:
xor eax,eax
mov eax, string
mov ebx,1 ; suppose I want to get the second character of string. SO I store the index of that character in ebx
mov eax,string
movzx eax,byte [eax]
push eax ; these push and pop are for solving it using the stack,
pop ebx
pusha
push ebx
call putchar
add esp,4
popa
pusha
push msg2
call printf
add esp,4
popa
我的查询具体是:
我将给出索引值。它应该在
ebx
注册表中吗?最重要的是,我使用堆栈的主要想法是使用
string
我之前推入的索引值来访问变量的每个字符ebx
。[这是强制性的。可能吗?]我也想将输出存储在一个 8 位寄存器中。
所以我的所有想法是这样的:
mov al, [string+ebx] ;is it possible?
我必须
ebx
从堆栈中获取值。我将在 中输入一个值ebx
,然后push ebx
在 时mov al,[string+ebx]
,我将pop ebx
获得用于mov
指令的值。指令更有可能看起来像:pop ebx mov al,[string+dword[ebx]] ;which is a wrong statement shown by NASM
我热切地等待着你的回应。
谢谢你,