【问题标题】:how to print multiple strings on new line in the Assembly Language如何在汇编语言的新行上打印多个字符串
【发布时间】:2020-07-15 05:52:48
【问题描述】:

我试图在 Assembly 的不同行上打印多个字符串,但使用我的代码,它只打印最后一个字符串。我对汇编语言很陌生,所以请多多包涵

 section .text             
                           
 global _start             
 _start:                    
  mov edx, len              
  mov edx, len1             
  mov edx, len2             
  mov edx, len3             
  mov ecx, msg              
  mov ecx, str1             
  mov ecx, str2             
  mov ecx, str3             
  mov ebx, 1                
  mov eax, 4                
  int 0x80                  
  mov eax, 1                
  int 0x80                  

   
  section .data             


 msg  db 'Hello, world!',0xa                       
 str1 db 'Learning is fun!',0xa 
 str2 db 'I love beacon!',0xa         
 str3 db 'I love programming',0xa                      
 len1 equ $ - str1           
 len2 equ $ - str2           
 len3 equ $ - str3           
 len  equ $ - msg            

它只会打印出我喜欢编程。

假设打印

 Hello World!
 Learning is fun!
 I love beacon!
 I love programming

【问题讨论】:

标签: linux assembly x86


【解决方案1】:
mov edx, len              
mov edx, len1             

你期待什么?

您正在覆盖寄存器edx

这就像其他编程语言中的以下代码:

variableEdx = len;
variableEdx = len1;

第二行会覆盖变量variableEdx,第一行的效果就没了!

如何打印多个字符串

函数eax=4将一些数据写入内存中,从某个地址开始,到某个设备的某个地址结束。

如果内存中第二个字符串紧跟第一个字符串,则可以将包含两个字符串的内存发送到设备。

例子:

...
mov edx, str1
mov ecx, 32
...

这会将内存中从str1 开始的 32 字节内容发送到设备。而从str1 开始的32 个字节是字符串str1str2

如果您想将多个内存块发送到设备,您可以使用writev() 系统调用,即函数eax=146。 (见this link)。

例子:

.text
.globl _start

_start:
    mov edx, 3
    mov ecx, offset list
    mov ebx, 1
    mov eax, 146
    int 0x80
    mov eax, 1
    int 0x80

.data

list:
    .long msg
    .long 7
    .long str1
    .long 8
    .long str3
    .long 19

    ...

不幸的是,我使用的汇编程序的语法与您的略有不同;但是,在您的程序集中,list 部分可能如下所示:

list dd msg
     dd 7
     dd str1
     ...

writev(函数 146)获取指向 ecx 寄存器中某个“列表”的指针以及 edx 寄存器中列表中的条目数。

列表中的每个条目都由两个 32 位字组成。第一个字是要写入设备的内存地址;第二个字是要写入的字节数。

上面的例子写成“你好,学习我喜欢编程”:

“msg”的前 7 个字节,然后是“str1”的前 8 个字节,然后是“str3”的所有 19 个字节。

【讨论】:

猜你喜欢
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多