我正在试图弄清楚如何使用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
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何使用scanf.有人可以给我一个最简单的源代码scanf吗?我真的只想把用户输入的内容放入其中.
我不习惯32位大会.我只使用16位,我知道在16位(DOS)你可以这样做:
mov ah, 3fh
mov dx, input
int 21h
input rb 100d
Run Code Online (Sandbox Code Playgroud)
无论你键入什么,都会放在"输入"的地址.
Pre*_*gha 16
我发现这是'在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
Run Code Online (Sandbox Code Playgroud)
这是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;
}
Run Code Online (Sandbox Code Playgroud)
谢谢普雷特。我根据你的代码做了一个简单的例子来说明scanf的使用。
请求一个整数并将其打印到屏幕上的程序:
section .text
global main
extern printf
extern scanf
section .data
message: db "The result is = %d", 10, 0
request: db "Enter the number: ", 0
integer1: times 4 db 0 ; 32-bits integer = 4 bytes
formatin: db "%d", 0
main:
; Ask for an integer
push request
call printf
add esp, 4 ; remove the parameter
push integer1 ; address of integer1, where the input is going to be stored (second parameter)
push formatin ; arguments are right to left (first parameter)
call scanf
add esp, 8 ; remove the parameters
; Move the value under the address integer1 to EAX
mov eax, [integer1]
; Print out the content of eax register
push eax
push message
call printf
add esp, 8
; Linux terminate the app
MOV AL, 1
MOV EBX, 0
INT 80h
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28861 次 |
| 最近记录: |