使用子例程将数字字符串转换为整数
Convert a string of digits to an integer by using a subroutine
汇编语言程序以字符串形式读入(三位或更多位)正整数并将该字符串转换为整数的实际值。
具体来说,创建一个读入数字的子程序。将其视为一个字符串,尽管它将由数字组成。此外,创建一个子例程将一串数字转换为整数。
不必测试有人认为 i8xc 是整数的输入。
我是这样做的。请帮忙。
.section .data
String:
.asciz "1234"
Intg:
.long 0
.section .text
.global _start
_start:
movl , %edi
movl $String, %ecx
character_push_loop:
cmpb [=10=], (%ecx)
je conversion_loop
movzx (%ecx), %eax # move byte from (%ecx) to eax
pushl %eax # Push the byte on the stack
incl %ecx # move to next byte
jmp character_push_loop # loop back
conversion_loop:
popl %eax # pop off a character from the stack
subl , %eax # convert to integer
imul %edi, %eax # eax = eax*edi
addl %eax, Intg
imul , %edi
decl %ecx
cmpl $String, %ecx # check when it get's to the front %ecx == $String
je end # When done jump to end
jmp conversion_loop
end:
pushl Intg
addl , %esp # clean up the stack
movl [=10=], %eax # return zero from program
ret
此外,我无法获得输出。我遇到了分段错误。我无法找出我的代码中的错误是什么。
缺少与操作系统的正确交互。
在 end:
中,您推送了结果,但随后的 addl , %esp
使推送的值无效,最后的 ret
错误地将指令流引导至 SS:ESP+4
指向的内存中的任何垃圾在程序入口处。
当你增加堆栈指针时,你不能相信低于 ESP 的数据会存活。
你的程序不与它的用户交互,如果你想让它打印一些东西,使用系统函数来写。
print_String:
mov ,eax ; System function "sys_write".
mov ,ebx ; Handle of the standard output (console).
mov $String,ecx ; Pointer to the text string.
mov ,edx ; Number of bytes to print.
int 0x80 ; Invoke kernel function.
end:mov ,eax ; System function "sys_exit".
mov (Intg),ebx ; Let your program terminate gracefully with errorlevel Intg.
int 0x80 ; Invoke kernel function.
汇编语言程序以字符串形式读入(三位或更多位)正整数并将该字符串转换为整数的实际值。
具体来说,创建一个读入数字的子程序。将其视为一个字符串,尽管它将由数字组成。此外,创建一个子例程将一串数字转换为整数。
不必测试有人认为 i8xc 是整数的输入。
我是这样做的。请帮忙。
.section .data
String:
.asciz "1234"
Intg:
.long 0
.section .text
.global _start
_start:
movl , %edi
movl $String, %ecx
character_push_loop:
cmpb [=10=], (%ecx)
je conversion_loop
movzx (%ecx), %eax # move byte from (%ecx) to eax
pushl %eax # Push the byte on the stack
incl %ecx # move to next byte
jmp character_push_loop # loop back
conversion_loop:
popl %eax # pop off a character from the stack
subl , %eax # convert to integer
imul %edi, %eax # eax = eax*edi
addl %eax, Intg
imul , %edi
decl %ecx
cmpl $String, %ecx # check when it get's to the front %ecx == $String
je end # When done jump to end
jmp conversion_loop
end:
pushl Intg
addl , %esp # clean up the stack
movl [=10=], %eax # return zero from program
ret
此外,我无法获得输出。我遇到了分段错误。我无法找出我的代码中的错误是什么。
缺少与操作系统的正确交互。
在 end:
中,您推送了结果,但随后的 addl , %esp
使推送的值无效,最后的 ret
错误地将指令流引导至 SS:ESP+4
指向的内存中的任何垃圾在程序入口处。
当你增加堆栈指针时,你不能相信低于 ESP 的数据会存活。
你的程序不与它的用户交互,如果你想让它打印一些东西,使用系统函数来写。
print_String:
mov ,eax ; System function "sys_write".
mov ,ebx ; Handle of the standard output (console).
mov $String,ecx ; Pointer to the text string.
mov ,edx ; Number of bytes to print.
int 0x80 ; Invoke kernel function.
end:mov ,eax ; System function "sys_exit".
mov (Intg),ebx ; Let your program terminate gracefully with errorlevel Intg.
int 0x80 ; Invoke kernel function.