第 10 章:CALL 和 RET 指令

检测点 10.1

补全程序 ,实现从内存 1000:0000 处开始执行指令。

assume cs:code

stack segment
    db 16 dup (0)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,16
    mov ax,1000h    ; CS,先入后出
    push ax
    mov ax,0000h    ; IP
    push ax
    retf
code ends

end start

检测点 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 编写子程序

一、显示字符串

显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

描述

名称

show_str

功能

在指定的位置,用指定的颜色,显示一个用 0 结束的字符串。

参数

(dh)=行号(取值范围 0~24)

(di)=列号(取值范围 0~79)

(cl)=颜色

ds:si 指向字符串的首地址

返回

应用举例

在屏幕的 8 行 3 列,用绿色显示 data 段中的字符串。

参考链接

Last updated