[英]Manually Add Newline To Stack Variable In x86 Linux Assembly
我编写了一个简单的汇编程序,该程序通过提示符从用户那里获取两个整数,将它们相乘并打印出来。 我想直接使用sys_read
而不是scanf
来执行此sys_read
,因此可以在删除LF
之后将输入手动转换为整数。
这是完整的源代码: http : //pastebin.com/utnjTvNZ
特别是,我现在想做的是手动将换行符添加到乘法结果中,该结果现在又转换回它的ASCII char等效项。 最初,我以为我可以左移16位并添加0xA
,例如在堆栈上留给我0x0034000A
2*2 (0x0034 is "4" in ASCII chars)
,然后是一个空终止符和一个LF
。 但是, LF
在打印结果之前。 我认为这是一种(0x000A0034)
,所以我尝试了相反的操作(0x000A0034)
,而只是打印了一些其他ASCII字符。
因此,简单地讲,如何正确地将换行符压入堆栈,以便在使用sys_write
时sys_write
号后打印换行符? 我所缺少的是字符串如何存储在堆栈上……我无法测试,因为通常您只是创建一个变量并将地址压入堆栈。
我知道这里的某些事情可以做得更好,更清洁,达到标准,什么都没有。 我凭直觉来理解事物,因此通常只需要做这件事就可以更好地理解堆栈和Linux系统调用。
好的,要感谢杰斯特的帮助,回答我自己的问题,要在内存中显示的32位单词中添加换行符,我必须了解字节序。 由于我是为32位编译的,因此我的程序可以在32位字上运行。 这些字的字节“向后”写入存储器。 单词本身仍以“正常”顺序存储。 例如0x0A290028 0x0A293928打印(NULL)LF(9)LF。 字节是向后的,但单词不是。 Sys_write因为只使用一个无效的* buf并且不知道字符串,所以只从缓冲区读取字节顺序的字节并将其吐出。
我能够做的就是将我的单位产品(例如0x00000034)左移8位。 这给我留下了0x00003400。 为此,我可以添加0x000A0000。 这将导致0x000A3400,并打印数字“ 4”,后跟换行符。
因此,新过程如下所示:
multprint:
mov eax, sys_write ;4
mov ebx, stdout ;1
mov ecx, resultstr
mov edx, resultstrLen
dec edx
int 0x80
pop eax ;multiplican't
pop ebx ;multiplicand
mul ebx
add eax, '0'
shl eax, 8 ;make room for () and LF
add eax, 0x0A290028
push eax
mov ecx, esp
;mov [num], eax ;use these two lines if I don't want to use the stack
;mov ecx, num
mov eax, sys_write
mov ebx, stdout
mov edx, 4
int 0x80
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.