gpt4 book ai didi

linux - Linux x86 intel 语法(NASM)中的条件跳转失败

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:04 24 4
gpt4 key购买 nike

故事(我是新手):我开始阅读关于使用著名的 nasm 汇编器进行汇编(x86 intel)编程的 pdf 教程,并且在执行非常基本的汇编代码时遇到问题(受到教程中有关循环的代码的启发)。

问题(JE 失败):该汇编代码应该从标准输入读取一个数字(一个字符(表示'0'+数字)),然后写入屏幕数字乘以“Hello world\n”。非常简单的循环:减少数字,如果数字等于零('0'不是整数字符)跳转(je)到退出(mov eax,1\nint 0x80)。

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

其实我的问题是当digit == '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: Hello World ......(稍后多次循环)...5:世界你好4:世界你好3:世界你好2:世界你好1:世界你好$

这就是我的问题:这段代码有什么问题?你能解释一下吗?而且我不需要可以神奇地(无需解释)运行的替代代码,因为我尝试学习(我是新手)

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

最佳答案

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

关于linux - Linux x86 intel 语法(NASM)中的条件跳转失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22326566/

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