Win32下AT&T汇编Hello world教程

因为复试的需要,学习了下和汇编相关的东西,

虽然当年学过微机原理,不过没下功夫[其实是老师水,教材水啊....]

现在只能恶补了

这两天玩了下masm,nasm,gas,当然只是搭建了基本的环境,跑了下基本的实例

因为gas相关文档比较稀缺,所以本篇日志记录一些和其相关的

主要目的是备份一下,省的以后忘了

顺便说一下,我用的是和谐的WinXP系统

1.环境搭建,从sf下MinGW套件,这一步不在赘述

2.基本的程序

先来一个最简单的hello world,不过用到了c运行时,

当然也可以写那种纯粹的保护模式的,不过比较麻烦,现在也没深入研究,故暂不讨论

 

.section .data
out_text:
    .asciz "hello world"
.section .text
.globl _main
_main:
    pushl $out_text
    call _printf
    pushl $0
    call _exit
这里用到了c运行时的main,exit,printf函数,因为win32的原因多加了个下划线
3.编译
as test_win.s -o test_win.o -gstabs 
ld test_win.o -o test_win.exe -Le:/mingw/lib -lcrtdll
-gstabs保留了调试相关的符号表
-Le:/mingw/lib -lcrtdll链接了c运行时,注意mingw路径是我机器上的
4.运行

上面那个是带有调试信息的,可以看到strip后只有2K了
5.调试
注意不要strip

这里面要注意的是设置断点时的*号,以及main和_main的区别
另外查看寄存器可用"i r"指令
6.com版本的hello world
这个不管怎样还是大了点,想想当年学习微机原理的伪dos程序貌似是按字节论的,
下面就来个com版的hello world
(1)代码test.s
.code16
.text
    movw %cs, %ax
    movw %ax, %ds
    movw %ax, %es
    movw %ax, %ss
     
    movw $11, %cx
    movw $0x1301,%ax
    movb $0x07,%bl
    movw $0,%dx
    movw $outstring,%bp
    int $0x10
    jmp .
outstring:
    .asciz "hello world"
注意.code16是很有必要的
(2)编译
as test.s -o test.o 
ld test.o -Ttext 0x0100 -o test.exe
objcopy.exe -R .pdr -R .comment -R .note -S -O binary test.exe test.com
最后的objcopy将编译后的按binary输出成.com格式的
[另外如果跳过第二部exe生成,直接从.o生成.com也是可以运行的,不过对比发现有1bit的异常引起了输出字符的乱码
具体原因我就不去纠结的探索了,如果修改了那一比特,字符显示就正常了]
另外链接时的-Ttext 0x0100也可以用如下lds文件来控制
SECTIONS
{
. = 0x0100;
.text : {*(.text)}
}
同时链接时的选项应该为-Ttest.lds
(3)输出

(4)修改
此时如果ls -l一下会发现有将近4k之巨,这是因为填充了很多的0,用HxD这样的软件把结尾的0
给干掉再看其大小

看看最后的那个文件52字节,终于瘦身成功了!


 

posted @ 2011-03-09 13:52  平繁  阅读(2803)  评论(0编辑  收藏  举报