« 软件设计与开发实践IV——课程要求AT&T汇编基础 »

对scanf和printf的处理

对于能力有限的同学,可以在汇编中直接使用scanf/printf(str1, val11, val12, ...)来处理,其中str1为格式字符串;val11、val12为变量;所有字符串和变量均放在数据段。我们会把该scanf和printf替换成汇编指令进行编译连接。

对于稍有能力的同学,可以使用汇编指令进行编写,以下是两种汇编写法:

        1.       调用C语言函数执行:

对于printf("just a test of %d\n", 10);语句翻译之后结果
 
.section .data
text .ascii        "just a test of %d\n\0"
val    .int   10
.section .text
.globl _start
_start:
         pushl        val                     //压入参数
         pushl        $text
         call   printf                         //调用函数
         mov $1, %eax
         mov $0, %ebx
         int  $0x80
 
编译使用as -o 文件名.o 源文件
连接使用ld -o 执行文件 文件名.o -dymanic-linker /lib/ld-linux.so.2 -lc
 
2.       调用系统调用执行:
 
.section .bss
         .lcomm    buffer, 6
.section .text
.globl _start
_start:
         movl $3, %eax                          //3号系统调用read()
         movl $0, %ebx                          //文件id为0,表示stdin
         movl $buffer, %ecx         //读取目标位置
         movl $6, %edx                          //读取长度
         subl cur, %edx
         int $0x80
 
         movl $4, %eax                          //4号系统调用write()
         movl $1, %ebx                          //文件id为1,表示stdout
         movl $buffer, %ecx         //写出的字符串地址
         movl $6, %edx                          //写出字符串长度
         int $0x80
 
         movl $1, %eax
         movl $0, %ebx
         int $0x80
        
使用linux下的as,ld正常编译连接即可

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。