繁体   English   中英

在x86 Linux程序集中手动添加换行符以堆叠变量

[英]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_writesys_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM