第10章 call 和 ret 指令
10.1 ret 和 reft 指令
call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP 。他们经常被共同来实现子程序的设计。
10.2 call 指令 和 根据位移 转移的call指令
段间转移 的 call 指令
转移地址 在 寄存器 中 的 call 指令
转移地址在内存 中 的 call 指令
10.7 call 和 ret 的配合使用 来 实现子程序
子程序 框架
10.8 乘法指令
10.12 寄存器的冲突问题
实验 10 解析
王爽《汇编语言》(第三版)实验10解析:https://www.cnblogs.com/nojacky/p/9523904.html
1. 显示字符串
示例代码:
- assume cs:code
-
- datasg segment
- db 'welcome to masm!', 0
- datasg ends
-
- code segment
-
- start:
- mov dh, 8
- mov dl, 3
- mov cl, 2
- mov ax, datasg
- mov ds, ax
- mov si, 0
- call show_str
- mov ax, 4c00h
- int 21h
-
- show_str:
- push dx
- push cx
- push si ; 保护子程序寄存器中用到的寄存器
- ; 由于主程序的限定
- ; 这里由CPU自动为我们分配栈空间
-
-
- mov di, 0 ; 显示缓存区中的偏移量
- mov bl, dh
- dec bl ; bl-1才是真正的行,因为行号从0开始计数
- mov al, 160
- mul bl ; 每行160字节 用 行数*每行偏移量 得到目标行的偏移量
- mov bx, ax ; mul bl之后,乘积存储在ax中,这里要转存入bx中
- mov al, 2