汇编学习2
用汇编语言编写程序
汇编程序–>编译器–>机器码
1 | mov ax, 4c00H |
相当于return 0,程序结束,把控制权交还给系统
一个有意义的汇编程序中至少要有一个段—-代码段
段定义
段名 segment ----段的开始
...
段名 ends ----段的结束
end
汇编程序结束的标记位置
assume
1 | assume cs:codesg |
将段名为codesg的起始地址放入cs代码段寄存器
完整源程序.asm示例
1 | assume cs:codesg |
编译
使用masm编译源码文件
1 | masm p4-1.asm; |
生成p4-1.OBJ
使用link连接OBJ文件
1 | link p4-1 |
debug装载程序
1 | debug p4-1 |
r命令查看寄存器得到ds=075a,cs=076a,ip=0000,即程序在内存加载的起始位置为075a:0000,代码起始位置为076a:0000,中间的100H字节为程序段前缀(PSP),作为数据区。cx存放代码长度
loop
loop实现循环
- (cx) = (cx) - 1
- 判断cx不为0则转至标号执行
例1计算2^12的值
1 | assume cs:code |
例2计算ffff:0006字节单元数据乘3,存储在dx中
1 | assume cs:code |
段前缀
debug里写入mov al,[0]
,u命令查看是正常的,但是写入源文件编译连接后,翻译出的指令为mov al,00
与我们的目的不同(具体原因未知)
因此在源文件中使用内存需要加段前缀
1 | mov ax,2000h |
将数据代码栈分段
例1
实现利用栈将数据逆序
1 | assume cs:code,ds:data,ss:stack |
初始化寄存器
1 | mov ax,stack |
注意,代码段寄存器cs可以不赋值,因为会根据cs:code自动赋值,但是ss和ds需要手动赋值
入栈
1 | mov bx,0 |
出栈
1 | mov bx,0 |
例2
实现大小写字符转换
1 | assume cs:codesg,ds:datasg |
dup指令
db 3 dup (0);定义3个字节,0,0,0
db 3 dup (0,1,2);定义9个字节,0,1,2,0,1,2,0,1,2
db 2 dup (‘abc’,’ABC’);定义12个字节,’abcABCabcABC’
db - 字节型数据
dw - 字型数据
dd - 双字型数据
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ciiki的博客!
评论