在命令行中传递参数,汇编编程
Passing parameter in command line, Assembly Programming
让我简单解释一下:)。
我接近参数 10,通过使用 EBP 寄存器和 ebx 寄存器,因为它的堆栈结构包含 EBP(基址寄存器),return 地址,参数#,参数 1,参数 2。 .. 因为我不使用本地寄存器。
我可以看到参数已正确输入,因为我可以使用调用 print_string 打印它。但是,由于 < while: > 代码行,字符串 10 似乎没有被读取,因为当涉及到它时,推荐行什么都不做。
我会轻轻地问从哪里开始代码。谢谢阅读。
输入:./atoi 10
结果:10
%include "asm_io.inc"
segment .data
segment .bss
input resw 1
segment .text
global main
main:
enter 0,0
pusha
mov ebx, [ebp+12]
mov eax, [ebx+4]
; call print_string
dump_stack 1,2,4
mov ebx, 0
mov ecx, 10
while:
cmp al, 0x0a
je print
sub eax, 0x30
mov [input], eax
mov eax, ebx
mul ecx
add eax, [input]
mov ebx, eax
jmp while
print:
mov eax, ebx
call print_int
call print_nl
popa
mov eax, 0
leave
ret
您的 while 循环没有读取任何字符!您使用 mov dl,[eax]
.
检索这些
从下面的代码中可以看出,不需要使用临时 input 变量。
xor ebx, ebx ;Result
while:
movzx edx, byte ptr [eax] ;Read 1 character
test dl, dl ;Test for end of string
jz print ;End found
sub dl, 0x30 ;Go from character to value [0,9]
imul ebx, 10 ;Result x10
add ebx, edx ;Add new digit
inc eax ;To next character
jmp while
让我简单解释一下:)。
我接近参数 10,通过使用 EBP 寄存器和 ebx 寄存器,因为它的堆栈结构包含 EBP(基址寄存器),return 地址,参数#,参数 1,参数 2。 .. 因为我不使用本地寄存器。 我可以看到参数已正确输入,因为我可以使用调用 print_string 打印它。但是,由于 < while: > 代码行,字符串 10 似乎没有被读取,因为当涉及到它时,推荐行什么都不做。 我会轻轻地问从哪里开始代码。谢谢阅读。
输入:./atoi 10
结果:10
%include "asm_io.inc"
segment .data
segment .bss
input resw 1
segment .text
global main
main:
enter 0,0
pusha
mov ebx, [ebp+12]
mov eax, [ebx+4]
; call print_string
dump_stack 1,2,4
mov ebx, 0
mov ecx, 10
while:
cmp al, 0x0a
je print
sub eax, 0x30
mov [input], eax
mov eax, ebx
mul ecx
add eax, [input]
mov ebx, eax
jmp while
print:
mov eax, ebx
call print_int
call print_nl
popa
mov eax, 0
leave
ret
您的 while 循环没有读取任何字符!您使用 mov dl,[eax]
.
检索这些
从下面的代码中可以看出,不需要使用临时 input 变量。
xor ebx, ebx ;Result
while:
movzx edx, byte ptr [eax] ;Read 1 character
test dl, dl ;Test for end of string
jz print ;End found
sub dl, 0x30 ;Go from character to value [0,9]
imul ebx, 10 ;Result x10
add ebx, edx ;Add new digit
inc eax ;To next character
jmp while