Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编,我的代码有什么问题?输入、算术、打印_Assembly_X86 - Fatal编程技术网

Assembly x86汇编,我的代码有什么问题?输入、算术、打印

Assembly x86汇编,我的代码有什么问题?输入、算术、打印,assembly,x86,Assembly,X86,我需要一些关于我正在编写的程序的帮助。程序应该从标准输入中读取两个数字,保存并使用它执行基本的数学运算,然后返回 我想大部分事情都在起作用。但是它没有正确地打印结果。它打印出一大堆随机字符。我相信这个问题与ascii到int或代码中发生的int到ascii转换有关,但我不能确定 以下是我从输入读取的代码部分: mov byte [firstNum], 30 mov byte [firstNum + 1], 0 mov ah, 0Ah mov edx, firstNum

我需要一些关于我正在编写的程序的帮助。程序应该从标准输入中读取两个数字,保存并使用它执行基本的数学运算,然后返回

我想大部分事情都在起作用。但是它没有正确地打印结果。它打印出一大堆随机字符。我相信这个问题与ascii到int或代码中发生的int到ascii转换有关,但我不能确定

以下是我从输入读取的代码部分:

mov byte    [firstNum], 30
mov byte    [firstNum + 1], 0
mov     ah, 0Ah
mov     edx, firstNum
int     021H
movzx   esi, byte [firstNum+1]
mov     edx, firstNum+2 
add     esi, edx
mov byte    [esi], "$"

mov byte    [secondNum], 30
mov byte    [secondNum + 1], 0
mov     ah, 0Ah
mov     edx, secondNum
int     021H
movzx   esi, byte [secondNum+1]
mov     edx, secondNum+2
add     esi, edx
mov byte    [esi], "$"
其中:

firstNum    resb    32      ; first number
secondNum   resb    32      ; second number
result      resb    32      ; result 
下面是将字符串输入转换为整数、添加两个值、从整数转换为字符串并打印结果的部分:

push dword  secondNum+2
call        _atoi
add         esp, 4
mov         ebx, eax
push dword  firstNum+2
call        _atoi
add         esp, 4
add         eax, ebx
push dword  10                  ; base of 10, decimal
push dword  result
push dword  eax
call        _itoa
add         esp, 12
printOut    result

如果有人能告诉我我的代码出了什么问题,我将不胜感激。谢谢

嗯,有一点看起来是错误的,那就是如果
atoi
是C库版本,那么应该用零而不是美元符号终止输入字符串

我们也看不到段寄存器是否设置正确。要使
int 21
工作,必须将
DS
设置为保留缓冲区的段

此外,它看起来像是一个宏。因为您得到的是无意义的输出,所以可以肯定的是,您对该宏的调用设置不正确,否则宏本身就会出错。但是我们不知道它是如何工作的,所以不能说这段代码有什么问题。例如,如果
printOut
使用
int 21
,则它将使用美元符号终止符,而
itoa
将使用0

当汇编代码无法工作时,调试器就是您的朋友。你有没有试过一步一步地浏览代码,看看发生了什么


如果没有调试器,请删除输入部分并单独尝试输出部分:在eax中加载42并将其转换为字符串并将其转换为标准输出。

可执行文件的格式是什么?它以nasm(.asm文件)的形式编写我使用了调试器和所有工具,直到它尝试打印结果为止。我认为这可能与itoa有关,它以0结束,而不是以美元结束。我发现在字符串末尾追加$是一个简单的解决方案,可能不太理想,但它起了作用,我的结果应该打印出来!谢谢