gpt4 book ai didi

assembly - 如何在 NASM 中使用 scanf?

转载 作者:行者123 更新时间:2023-12-02 15:46:45 29 4
gpt4 key购买 nike

我想弄清楚如何使用 scanf获取用户输入。我知道使用 printf :我所要做的就是将我想在屏幕上写入的数据推送到堆栈中,如下所示:

global _main
extern _printf
extern _scanf

section .data
msg db "Hi", 0

section .text
_main:
push ebp
mov ebp, esp

push msg
call _printf

mov esp, ebp
pop ebp
ret

但我不知道如何使用 scanf .谁能给我最简单的源代码 scanf ?我真的只想输入用户输入的内容。

我不习惯 32 位汇编。我只使用过 16 位,而且我知道在 16 位(DOS)中你可以这样做:
mov ah, 3fh
mov dx, input
int 21h

input rb 100d

无论你输入什么,都会放在“输入”的地址。

最佳答案

我找到了 'Programming in NASM.PDF'

; add1.asm
SECTION .data
message1: db "Enter the first number: ", 0
message2: db "Enter the second number: ", 0
formatin: db "%d", 0
formatout: db "%d", 10, 0 ; newline, nul terminator
integer1: times 4 db 0 ; 32-bits integer = 4 bytes
integer2: times 4 db 0 ;
SECTION .text
global _main
extern _scanf
extern _printf

_main:

push ebx ; save registers
push ecx
push message1
call printf

add esp, 4 ; remove parameters
push integer1 ; address of integer1 (second parameter)
push formatin ; arguments are right to left (first parameter)
call scanf

add esp, 8 ; remove parameters
push message2
call printf

add esp, 4 ; remove parameters
push integer2 ; address of integer2
push formatin ; arguments are right to left
call scanf

add esp, 8 ; remove parameters

mov ebx, dword [integer1]
mov ecx, dword [integer2]
add ebx, ecx ; add the values ; the addition
push ebx
push formatout
call printf ; call printf to display the sum
add esp, 8 ; remove parameters
pop ecx
pop ebx ; restore registers in reverse order
mov eax, 0 ; no error
ret

这是这个 C 函数的 asm 版本:
#include <stdio.h>
int main(int argc, char *argv[])
{
int integer1, integer2;
printf("Enter the first number: ");
scanf("%d", &integer1);
printf("Enter the second number: ");
scanf("%d", &integer2);
printf("%d\n", integer1+integer2);
return 0;
}

关于assembly - 如何在 NASM 中使用 scanf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973650/

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