第 10 章:CALL 和 RET 指令
检测点 10.1
补全程序 ,实现从内存 1000:0000 处开始执行指令。
检测点 10.2
下面的程序执行后,ax 中的数值为多少?
内存地址
机器码
汇编指令
ax
IP
1000: 0
b8 00 00
mov ax,0
0000h
0003h
1000: 3
e8 01 00
call s
0006h
1000: 6
40
inc ax
(该行未执行)
1000: 7
58
s:pop ax
0006h
0008h
检测点 10.3
下面的程序执行后,ax 中的数值为多少?
内存地址
机器码
汇编指令
ax
bx
CS
IP
栈
1000: 0
b8 00 00
mov ax,0
0000h
1000: 3
9A 09 00 00 10
call far ptr s
1000h
0008h
0008h
1000h
1000: 8
40
inc ax
(该行未执行)
1000: 9
58
s: pop ax
0008h(IP)
1000h
add ax , ax
0010h
pop bx
1000h(CS)
add ax,bx
1010h
检测点 10.4
下面的程序执行后,ax 中的数值为多少?
内存地址
机器码
汇编指令
ax
IP
栈
1000: 0
b8 06 00
mov ax,6
0006h
0003h
1000: 3
ff d0
call ax
(跳转到 0006h)
0005h
0005h
1000: 5
40
inc ax
1000: 6
mov bp,sp
add ax, [bp]
000Bh
检测点 10.5
(1)下面的程序执行后,ax 中的数值为多少?(注意:用 call 指令的原理来分析,不要在 Debug 中单步跟踪来验证你的结论。对于此程序,在 Debug 中单步跟踪的结果,不能代表 CPU 的实际执行结果。)
为什么不让使用 debug 来逐步调试?因为在执行到 CALL 指令时,显示 ds:[0eh]=065D(在我的环境中debug 后),ds:[0eh] 中的内容是中断的信息,并不是我们程序所希望的 0011H,它一下就 jmp 到 065D 的地址去了,而不是 CS:11 地址执行。
(2)下面的程序执行后, ax 和 bx 中的数值为多少?
参考链接
汇编语言(王爽第三版)检测点10 - 筑基2017 - 博客园
实验 10 编写子程序
一、显示字符串
显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。
描述
名称
show_str
功能
在指定的位置,用指定的颜色,显示一个用 0 结束的字符串。
参数
(dh)=行号(取值范围 0~24)
(di)=列号(取值范围 0~79)
(cl)=颜色
ds:si 指向字符串的首地址
返回
无
应用举例
在屏幕的 8 行 3 列,用绿色显示 data 段中的字符串。
参考链接
汇编语言(王爽第三版)实验10:编写子程序 - 筑基2017 - 博客园
Last updated