红联Linux门户
Linux帮助

Linux中使用dd命令修改as86汇编编译链接后的程序

发布时间:2017-08-21 11:11:18来源:linux网站作者:grey_csdn
之前抄写了一段代码:
;
; boot.s --bootsect.S framework
;
.globlbegtext,begdata,begbss,endtext,enddata,endbss ;global flag
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x07c0
entry start
start:
jmpi Go,BOOTSEG
go:  mov ax,cs
mov ds,ax
mov es,ax
mov [msg1+17],ah ; need to understand
mov cx,#20
mov dx,#0x1004
mov bx,#0x000c
mov bp,#msg1
mov ax,#1301
int 0x10
loop0:     jmp loop0
msg1:     .ascii "Loading system ..."
.byte       31,10;need to understand
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
 
由于.org的定制,这个程序设计的时候生成的程序大小应该是512B。实际编译之后的结果查看信息如下:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$ls -l total 1
-rwxrwxrwx 1 rootroot 544 Aug 20 18:55 boot
-rwxrwxrwx 1 rootroot 232 Aug 20 18:41 boot.o
-rwxrwxrwx 1 rootroot 554 Aug 20 16:05 boot.s
 
从上面的结果,程序的实际大小是544B。原因是程序编译器是用于MINIX的,而多出的一部分信息是因为程序的头部多了MINIX系统执行头结构。修改的方式可以是用二级制编译的方式修改,当然还能够用Linux的dd修改。
 
修改过程以及结果如下:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$dd bs=32 if=boot of=./new_boot skip=1
16+0 records in
16+0 records out
512 bytes (512 B)copied, 0.004947 s, 103 kB/s
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$ls -l
total 2
-rwxrwxrwx 1 rootroot 544 Aug 20 18:55 boot
-rwxrwxrwx 1 rootroot 232 Aug 20 18:41 boot.o
-rwxrwxrwx 1 rootroot 554 Aug 20 16:05 boot.s
-rwxrwxrwx 1 rootroot 512 Aug 20 19:12 new_boot
 
从上面的结果来看,修改已经完成,文件的大小已经回到了512B。
 
附:Linux中dd命令的使用
使用了一次dd命令修改一个编译后的程序,最初抄命令的时候就觉得有点不确定。因为选项参数的形式让我看着有点像程序结构,特别担心因此而导致系统的错误。
之前的命令以及结果如下:
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$ls -l
total 9
-rwxrwxrwx 1 rootroot  544 Aug 20 18:55 boot
-rwxrwxrwx 1 rootroot  232 Aug 20 18:41 boot.o
-rwxrwxrwx 1 rootroot  554 Aug 20 16:05 boot.s
-rwxrwxrwx 1 rootroot 4940 Aug 20 19:28 dd.txt
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$dd bs=32 if=boot of=new_boot skip=1
16+0 records in
16+0 records out
512 bytes (512 B)copied, 0.005296 s, 96.7 kB/s
grey@DESKTOP-3T80NPQ:/mnt/e/01_workspace/15_linux/01_kernal/03_my_test_code$ls -l
total 10
-rwxrwxrwx 1 rootroot  544 Aug 20 18:55 boot
-rwxrwxrwx 1 rootroot  232 Aug 20 18:41 boot.o
-rwxrwxrwx 1 rootroot  554 Aug 20 16:05 boot.s
-rwxrwxrwx 1 rootroot 4940 Aug 20 19:28 dd.txt
-rwxrwxrwx 1 rootroot  512 Aug 20 19:35 new_boot
之前进这个操作的时候,看到if 和 of我就错认为是程序了。其实,这两个字母分别输输入文件和输出文件的缩写。而bs指定的则是一次读写的块大小,skip则指定跳过多少个块。
其实,这仅仅是dd的一个功能。除此以外,dd还能够进行文件格式的转换以及字母大小写的转换等等功能。还能够方便地定制出逗号分隔符文件等格式。具体的描述倒是可以直接看dd问文档手册了!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/32376.html