Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
C NASM堆栈错误?简单乘法程序_C_Assembly_Stack_Nasm - Fatal编程技术网

C NASM堆栈错误?简单乘法程序

C NASM堆栈错误?简单乘法程序,c,assembly,stack,nasm,C,Assembly,Stack,Nasm,目前我正在学习NASM,我正在制作一个简单的程序,通过移位和加法对任何用户输入变量进行乘法 我遇到了一系列问题:由于某种原因,我的被乘数是以一个字所能容纳的最大数据值给出的。此外,我的答案,如果程序应该走那么远,几乎总是错的(尽管我相信我的算法是正确的!) 我认为您的主要问题来自使用word变量。在堆栈上创建一个两字节的缓冲区,并调用scanf读取它几乎肯定是一个问题。以32位代码推送字是“合法的”,但可能会导致问题。在一个实例中,您使用两个变量调用printf,然后调用addesp,12。使它

目前我正在学习NASM,我正在制作一个简单的程序,通过移位和加法对任何用户输入变量进行乘法

我遇到了一系列问题:由于某种原因,我的被乘数是以一个字所能容纳的最大数据值给出的。此外,我的答案,如果程序应该走那么远,几乎总是错的(尽管我相信我的算法是正确的!)


我认为您的主要问题来自使用
word
变量。在堆栈上创建一个两字节的缓冲区,并调用
scanf
读取它几乎肯定是一个问题。以32位代码推送
字是“合法的”,但可能会导致问题。在一个实例中,您使用两个变量调用
printf
,然后调用
addesp,12
。使它们都
dword
s,并将堆栈操作保持在四字节块中。我想那会解决你大部分的问题

手册页明确建议不要将高级缓冲I/O函数与低级函数混用(
printf
scanf
fopen()
fread()
fwrite()
,等等。这些函数都是高级函数,
open()
read()
write()
…和系统调用都是低级函数)。我不认为这会给你带来任何问题,但它会导致奇怪的结果。例如,
printf
在刷新缓冲区之前不会打印任何内容。以换行结束或使用另一个高级I/O函数将刷新缓冲区<例如,代码>系统读取
。我会坚持这样或那样


祝你好运

为什么不把代码放在这里?我的公司防火墙不允许我访问pastebin。>8v(它工作正常吗?它具体做错了什么?
extern printf
extern scanf

section .data
    message: db "Enter your multiplicand: "
    message_L: equ $-message
    message2: db "The number you entered is: %d ", 10, 0
    message2_L: equ $-message2
    message3: db "Enter your multiplier: "
    message3_L: equ $-message3
    message4: db "Your multiplier is: %d ", 10, 0
    message4_L: equ $-message4
    message5: db "The product of this multiplication is: %d ", 10, 0
    mesasge5_L: equ $-message5
    fmt1: db "%d", 0

section .bss
    multiplicand: resw 1
    multiplier: resw 1
    product: resw 1

section .text
    global main
scanInt:
    push ebp
    mov ebp, esp
    sub esp, 2
    lea eax, [ebp-2]
    push eax
    push dword fmt1
    call scanf
    mov ax, word[ebp-2]
    mov esp, ebp
    pop ebp
    ret

main:
    xor eax, eax
    xor ebx, ebx
    xor ecx, ecx
    xor edx, edx

    mov eax, 4
    mov ebx, 1
    mov ecx, message
    mov edx, message_L
    int 80h

        call scanInt
        mov word[multiplicand], ax
    mov word[product], ax

    jmp print1
main2:
    mov eax, 4
    mov ebx, 1
    mov ecx, message3
    mov edx, message3_L
    int 80h

    call scanInt
    mov word[multiplier], ax

    jmp print2
main3:
    mov ax, word[multiplicand]
    jmp check
check:
    cmp word[multiplier], 2
    jz printAnswer
    ror [multiplier], 1
    shl word[multiplier], 1
    jc carry
    shr word[multiplier], 1
    shr word[multiplier], 1
    shl word[product], 1
    jmp check

carry:
    add word[product], ax
    shr word[multiplier], 1
    clc
    jmp check

endLoop:
    mov eax, 1
    mov ebx, 0
    int 80h

printAnswer:
    push ebp
    mov ebp, esp
    push word[product]
    push dword message5
    call printf
    add esp, 12
    mov esp, ebp
    pop ebp
    jmp endLoop

print1:
    push ebp
    mov ebp, esp
    push dword[multiplicand]
    push dword message2
    call printf
    add esp, 12
    mov esp, ebp
    pop ebp
    jmp main2

print2:
    push ebp
    mov ebp, esp
    push dword[multiplier]
    push dword message4
    call printf
    add esp, 12
    mov esp, ebp
    pop ebp
    jmp main3