在linux x86 intel语法(NASM)中,条件跳转失败



故事(IM A NEWBIE(:我开始阅读一篇关于使用著名的nasm汇编程序在汇编(x86intel(中编程的pdf教程,我在执行一个非常基本的汇编代码时遇到了问题(灵感来自教程中关于循环的代码(。

问题(JE失败(:这个程序集代码应该从stdin读取一个数字(一个字符(意思是"0"+数字((,然后将数字乘以"Hello world"写入屏幕。非常简单的循环:减少数字,如果数字等于零("0"不是字符的整数(,则跳(je(到出口(mov eax,1\nint 0x80(。

听起来真的很简单,但当我尝试执行输出时却很奇怪。(真的很奇怪而且很大(它在循环中运行多次,当数字等于"0"时停止(这很奇怪,因为在程序停止之前,条件数字=="0"已经测试了多次,应该是真的(

事实上,我的问题是,当数字=="0"时,代码无法跳转

代码(很大(

segment .text
global _start
_start:
;Print 'Input a digit:'.
mov eax,4
mov ebx,1
mov ecx,msg1
mov edx,len1
int 0x80
;Input the digit.
mov eax,3
mov ebx,0
mov ecx,dig
mov edx,2
int 0x80
;Mov the first byte(the digit) in the ecx register.
;mov ecx,0
mov ecx,[dig]
;Use ecx to loop dig[0]-'0' times.
loop:
mov [dig],ecx
mov eax,4
mov ebx,1
mov ecx,dig
mov edx,1
int 0x80
mov eax,4
mov ebx,1
mov ecx,Hello
mov edx,Hellolen
int 0x80
;For some debuging (make the loop stop until return pressed)
;mov eax,3
;mov ebx,0
;mov ecx,some
;mov edx,2
;int 0x80
;Just move dig[0](some like character '4' or '7') to ecx register and compare ecx with character '0'.
mov ecx,[dig]
dec ecx
cmp ecx,'0'
;If comparison says ecx and '0' are equal jump to exit(to end the loop)
je exit
;If not jump back to loop
jmp loop
;Other stuff ...(like an exit procedure and a data(data,bss) segment)
exit:
mov eax,1
int 0x80
segment .data
msg1 db "Input a digit:"
len1 equ $-msg1
Hello db ":Hello world",0xa
Hellolen equ $-Hello
segment .bss
dig resb 2
some resb 2

输出

输入数字:44:你好世界3:你好世界2:你好世界1:你好世界0:你好世界。。。…(后面有许多循环(。。。5:你好世界4:你好世界3:你好世界2:你好世界1:你好世界$

这就是我的问题:这个代码出了什么问题?你能解释一下吗?而且我不需要会神奇地(没有解释(运行的替代代码,因为我试图学习(我是一个新手(

这是我的问题(也是我在Stackoverflow.com中的第一个问题(

ECX是32位,一个字符只有8位。使用8位寄存器,例如CL,而不是ECX

正如jester所提到的,ecx作为一个字符出现,因此您可能应该使用cl

loop:
  mov [dig],cl
  ...
  mov cl,[dig]
  dec cl
  cmp cl,'0'
  jne loop

您也可以用movzx加载ecx,它清除寄存器的顶部位(即零外部加载(:

  ...
  movzx ecx, byte [dig]
loop:
  mov [dig], cl           ; store just the low byte, if you want to store
  ...
  movzx ecx, byte [dig]
  dec ecx
  cmp ecx, '0'
  jne loop

请注意,通常建议您不要使用al、bl、cl、dl寄存器,因为它们的使用尚未完全优化。我不知道这是否仍然是真的。

最新更新