Assembly NASM组件;跳转在此代码中不起作用

Assembly NASM组件;跳转在此代码中不起作用,assembly,nasm,Assembly,Nasm,在这段代码中,我试图让编译器识别字符串中的第二个字符。例如,我输入haris;然后我希望能够迭代到字符串“haris”中的“a”。我使用lea获取指向寄存器存储“haris”的指针。然后我增加了寄存器eax,它作为指针,最初指向“h”,所以它应该指向“a”——对吗?然而,我的代码似乎没有按预期的那样工作,因为如果它工作了,跳转到_works应该会工作 extern _printf extern _scanf extern _printf extern _system extern _strcmp

在这段代码中,我试图让编译器识别字符串中的第二个字符。例如,我输入haris;然后我希望能够迭代到字符串“haris”中的“a”。我使用lea获取指向寄存器存储“haris”的指针。然后我增加了寄存器eax,它作为指针,最初指向“h”,所以它应该指向“a”——对吗?然而,我的代码似乎没有按预期的那样工作,因为如果它工作了,跳转到_works应该会工作

extern _printf
extern _scanf
extern _printf
extern _system
extern _strcmp

segment .data


szPAUSE db'PAUSE', 0
szStrIn db '%s',0
szName db 0,0
szNworks db 'Doesnt work', 10,0
szworks db 'Does work', 10,0


segment .code

global _main

_main:
enter 0,0

;get name. I input "haris" for test
push szName 
push szStrIn
call _scanf
add esp, 8

;;test to see if name was inputted
mov esi, szName
push esi
call _printf
add esp, 4

;;get the address of the second character in szName, which in my case is "a"
lea eax, [esi+1]

;; compare the second character with "a"
cmp eax, 0x61
je _works

;; if the character is not equal to "a"
push szNworks
call _printf
add esp, 4

push szPAUSE
call _system
add esp, 4

leave 
ret

;;if the character is equal to "a"
_works:
push szworks
call _printf
add esp, 4

push szPAUSE
call _system
add esp, 4

leave 
ret

正如您的评论所说,您将地址加载到
eax
,而不是字符本身。您应该使用
movzx eax,byte[esi+1]
来加载扩展名为零的字符,而不是
lea
(因为您稍后将使用
eax
)。如果保留
lea
,则需要在后面插入
movzx-eax,字节[eax]
。如果以后注意只使用低位8位,则可以使用simple
mov
,例如:

mov al, [esi+1]
cmp al, 0x61

正如您的评论所说,您将地址加载到
eax
,而不是字符本身。您应该使用
movzx eax,byte[esi+1]
来加载扩展名为零的字符,而不是
lea
(因为您稍后将使用
eax
)。如果保留
lea
,则需要在后面插入
movzx-eax,字节[eax]
。如果以后注意只使用低位8位,则可以使用simple
mov
,例如:

mov al, [esi+1]
cmp al, 0x61

你能告诉我mov和movzx的区别吗?我们没有在课堂上讨论movzx。谢谢。@haris:
movzx-eax,byte[esi+1]
将从
[esi+1]
加载一个字节,然后零将值扩展到
eax
(即,24个最高有效位都设置为零)。@haris:Intel有一个很好的PDF文件记录了所有x86指令,以及它们的具体功能。你能告诉我mov和movzx的区别吗?我们没有在课堂上讨论movzx。谢谢。@haris:
movzx-eax,byte[esi+1]
将从
[esi+1]
加载一个字节,然后零将值扩展到
eax
(即,24个最高有效位都设置为零)。@haris:Intel有一个很好的PDF文件记录了所有x86指令,以及它们的具体功能。请参阅上的链接。