本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著
实验前别忘了复习笔记
(1)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
(1)答案
- ①不变 先入后出,未改变data段数据。
- ②填写实际加载的地址,非标准答案
- ③X-2、X-1 由cs、ss、ds可得
(2)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
(2)答案
- ①前两个字数据不变,其余6个字补零。
u获取程序末尾地址,g 地址跳转到程序末尾最后
d ds:0查看data段数据
实际上只申请了4个字节的空间,但在汇编中,直接分配16字节,不足用00补全。
- ②填写实际运行的地址,非标准答案。
- ③X-2、X-1。
- ④(N//16+1)*16个字节
N字节数据实际占用空间为(N//16+1)*16个字节,对于每一个段,会用0补齐到16个字节的正整数倍,//为向下取整除法
(3)将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assume cs:code,ds:data,ss:stack
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0
stack ends
end start
(3)答案
- ①前两个字数据不变,其余6个字补零。
- ②填写实际运行的地址,非标准答案。
- ③X+3、X+4。
CX指明本程序机器码占用44H,68字节。由于加载会补全到16的正整数倍大小,因此总共三个段空间为16*5B,data、stack段各占16B,code段长度16*3B,因此+3与+4
(4)如果将(1)、(2)、(3)题中的最后一条伪指令 “end start"改为“end" (也就是说不指明程序的入口),则那个程序仍然可以正确执行?请说明原因。
(4)答案
都能运行,但只有(3)正常运行。其他程序都将data段当作代码运行。
(5)程序如下,编写code段中的代码,将a段和b段数据依次相加,结果存入c段中。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
code segment
start:
?
code ends
end start
(5)答案
c段命名冲突,改成cc段
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
cc segment
db 0,0,0,0,0,0,0,0
cc ends
code segment
start:
;需要三个段寄存器指向三个段
;c段是普通段,不优先考虑使用栈段寄存器ss
;可供选用的只有ds和es段寄存器
mov ax,b
mov es,ax ;将es指向b段
mov bx,0 ;作为地址递增
mov cx,8 ;循环八次
s:
mov ax,a
mov ds,ax ;先将ds指向a段
mov dl,[bx] ;获取一个a段的字节型数据
add dl,es:[bx] ;与对位的b段字节型数据相加
mov ax,cc
mov ds,ax ;ds指向cc段
mov [bx],dl ;对位存储
inc bx ;地址递增
loop s ;循环
code ends
end start
u获取循环处地址用g跳转,p跳过循环,d ds:0查看cc段存储的数据
结果正确