电子说
经过理论铺垫,现在正式进入语言实际操作和效果展示,该篇文章主要是介绍常用命令与命令的惯常用法;编写、编译一般的汇编程序;阅读机器码。
一、常用的命令
汇编代码主要由助记符和操作数组成,格式通常如下
例:
MOV AX,0x10
上述例子只是一个简单的举例,事实上,mov指令还有能在多种用法,如下图所示。
将上述上图抽象出来便有以下关系:
MOV 目的,源
既:
MOV reg/mem,reg/mem/Imm
其中:
reg 寄存器
mem 内存
imm立即数
又可以在名称后面跟数字表示位数,如imm32 就是可以操作32位数据。
必须明确,源操作数位数必须与目的操作数位数相同。
注:学习更多指令语法参考文末百度云书籍。
对机器而言这种编码组织形式是高效的,作为人类这种高效无疑增加了复杂性。
现代不是计算机刚问世的时期,现代工程师要追求最优解。
经过工程师迭代,在汇编语言基础上开发出来的编译器普遍具有伪指令、标号等功能以便源文件具有较高可读性。
例:
Start:;标号声明该段代码代号,标号不会参与编译过程
MOV AX,0x10 ;0x10复制给AX寄存器
MOV CX,0x00 ;0x00复制给CX寄存器
ADD AX,CX ;AX寄存器值加上CX寄存器值
将上述程序存放起来,命名为10_01.asm,.asm为汇编源文件,使用NASM编译。
编译命令:nasm -f bin .\\10_01.asm -o .\\10_01.bin
其中:
nasm 执行程序
10_01.asm 源文件
-f bin 指定输出文件格式为.bin
注:更多指令语法参考文末百度云书籍。
编译后将.bin文件打开得到如下图数据:
为研究方便,再对输出文件进行反汇编。
将.bin文件在0x7c00处反编译
使用命令:ndisasm -o 0x7c00 .\\10_01.bin >> .\\10_01-1.asm
得到:
00007C00B81000 mov ax,0x10
00007C03B90000 mov cx,0x0
00007C06 01C8 add ax,cx
现在所有东西都一目了然,在.bin文件中:
B8为mov AX指令所对应的机器码,因为AX宽16位,而0x10为8位所以补两个0凑够16位,X86立即数先低位后高位存放0010在内存中便是1000;B9同理。
01为add指令机器码,C8代表AX,CX两个寄存器值相加。
现在了解了简单的汇编语言,我们必须要查看一下效果。
为此,helloworld虽迟但到!
1、建立helloworld.asm
2、输入以下指令
org 07c00h ;程序起始位07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $ ;死循环
DispStr:;字符串调用函数
mov ax,BootMessage
mov bp,ax ;串地址
mov cx,11 ;串长度
mov ax,01301h ;AH = 13,AL = 01h
mov bx,000ah ;黑底绿字
mov dl,0
int 10h ;10h号中断
ret
BootMessage:db "Helloworld!"
times 510 - ($-$$)db 0
;生成一串512字节二进制代码
dw 0xaa55 ;结束标志
3、编译
nasm -f bin .\\helloworld.asm -o .\\helloworld.bin
4、效果
上述源码看客们可以先行阅读,下一篇推文对源码进行解析。
参考文献:
[1]Nasm.[EB/OL]. http://www.bytekits.com/nasm/intro.html.
[2] 蹦蹦骑士.[EB/OL].https://www.cnblogs.com/alwaysking/p/7623781.html#:~:text=%E7%BC%96%E
[3] 万一.[EB/OL]. https://www.cnblogs.com/del/archive/2010/03/16/1687665.html.-.
[4]INTEl.[EB/OL]. https://css.csail.mit.edu/6.858/2015/readings/i386.pdf.-.
全部0条评论
快来发表一下你的评论吧 !