因为复试的需要,学习了下和汇编相关的东西,
虽然当年学过微机原理,不过没下功夫[其实是老师水,教材水啊....]
现在只能恶补了
这两天玩了下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字节,终于瘦身成功了!