学习目标
书籍 第六章
学习内容
类型:汇编语言
进度:初学
天数:第四天
日期:2020年09月18日
书籍:李忠汇编语言
相关:李忠汇编语言网易云课堂视频
内容:书籍 第六章 视频86
时间:2020年09月18日 15:00-2020年9月19日 1:00
学习时间
[60分钟] 15:05-16:05 Anki卡片学习、复习
[02分钟] 16:05-16:07 Anki卡片所学内容补充、添加、修改
[03分钟] 16:07-16:10 Xmind思维导图补充、添加、修改
【65分钟】 回顾/复习
[05分钟] 16:10-16:15 CSDN博客添加学习记录
[05分钟] 16:15-16:20 有道云笔记添加学习笔记
[10分钟] 16:20-16:30 浏览新闻博客,扩充视野
[20分钟] 16:30-16:50 偷闲杂事处理
[50分钟] 16:50-17:40 做好学习准备(准备好视频、书籍等)
[20分钟] 17:40-18:00 预习所学知识
【110分钟】 预习/预备
[60分钟] 18:00-19:00 第一次学习
学习内容:书籍 6.0-6.5
[40分钟] 19:00-19:40 休息
[40分钟] 19:40-20:20 第二次学习
学习内容:书籍 6.6
[40分钟] 20:20-21:00 休息
[60分钟] 21:00-22:00第三次学习
学习内容:书籍 6.6-6.9
[10分钟] 22:00-22:10 休息
[40分钟] 22:10-22:50 第四次学习
学习内容:书籍 6.10-6.12
[50分钟] 22:50-23:40 第五次学习
学习内容:书籍 检测点6.1-本章习题 视频86
[50分钟] 00:00-00:50 第六次学习
学习内容:笔记添加修改、卡片整理。
【300分钟】 学习
学习检测
第六章
检测点 6.1
选择填空:
NOVSB指令每次传送一个(),MOVSW指令每次传送一个()。原始数据在段内的偏移地址在寄存器()中,要传送的目的位置的偏移地址再寄存器()中。如果要连续传送多个字或字节,则需要()前缀,在寄存器()中设置传送的次数,并设置传送的方向。其中,()指令只是正向传送,()指令指示反向传送。反向传送时,每传送一次,SI和DI的内容将()。
A.字节 B.字 C.di D.si E.cx F.rep G.减小 H.std I.cld J.增大
答案:A B D C F E I H G
检测点6.2
选择题:下面哪些指令是错误的,为什么?
A.add ax,[bx] B.mov ax,[si] C.mov ax,[cx]
D.mov ds,[di] E.mov dx,[ax] F.inc byte [di] G.div word [bx]
答案 :
C.如果要用寄存器来提供偏移地址,只能使用BX、SI、DI、BP,不能使用其它寄存器。
E.如果要用寄存器来提供偏移地址,只能使用BX、SI、DI、BP,不能使用其它寄存器。
检测点6.3
假设以下声明的是有符号数,那么其中的负数是()
data0 db 0xf0,0x05,0x66,0xff,0x81
data1 dw 0xfff,0xffff,0x8b,0x8a08
答案 :
0xfo =1111 0000=负数
0x05=0000 0101
0x66=0110 0110
0xff =1111 1111=负数
0x81=1000 0001=负数
第一个字符小于8为正,大于等于8(即8到F)为负!
0xfff=111111111111
0xffff=1111111111111111=负数
0x8b=10001011
0x8a08=1000101000001000=负数
检测点6.4
1.ZF标志位和该标志位有关的条件转移指令用得非常频繁,但很多人容易在ZF标志位上犯糊涂,以为计算结果为零时,ZF为”0”,为了证明你不犯糊涂,请填空:
在ZF=(1)时,表明计算结果为零;jz指令的意思是当ZF=(1),即计算结果为(0)时转移;
je指令的意思是当ZF=(1),即计算结果为(0)时转移;jnz指令的意思是当ZF=(0),即计算结果不为(0)时转移;jne指令的意思是当ZF=(0),即结算结果不为(0)时转移。
2.
cmp ax,bx
ja lbb | jg lbb
cmp ax,bx
je lbz
cmp ax,bx
jb lbl | jl lbl
本 章 习 题
1.在某程序中声明和初始化了以下的有符号数。请问,正数和负数各有多少?
data1 db 0x05,0xff,0x80,0xf0,0x97,0x30
data2 dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc
正 6 负6
3.请问下面的循环将执行多少次:
mov cx,0
delay: loop delay
1.loop是先将cx减一,再判断是否循环,第一次循环后,cx=FFFF(65535)
2.从FFFF循环到CX为0,共65535次,最后一次,cx从1变成0,不再循环。
2.如果可能的话,尝试编写一个主引导扇区程序来做上面的工作。
;统计data1和data2里的正负数数量。AX=正数数量,DX=负数数量
jmp near start
data1 db 0x05,0xff,0x80,0xf0,0x97,0x30
data2 dw 0x90,0xfff0,0xa0,0x1235,0x2f,0xc0,0xc5bc
start:
mov ax,0x7c0 ;设置数据段基地址
mov ds,ax
;正负数的计数器清零
xor ax,ax
xor dx,dx
;统计data1处的正数和负数。
mov cx,data2-data1 ;循环次数(数据总数或者总字节数)
mov bx,data1 ;要判断的数字的首地址
cnt1:
cmp byte ds:[bx],0x80 ;按无符号数进行比较。高于等于0x80意味是负数。转neg1执行
;cmp byte [bx],0
jae neg1 ;正数数量加一
;jl negl
inc ax
jmp pos1
neg1:
inc dx ;负数数量加一
pos1:
inc bx ;指向下一个要判断的数
loop cnt1
;统计data2处的正数和负数。
mov cx,(start-data2)/2 ;循环次数(数据总数或者总字节数)
mov bx,data2 ;要判断的数字的首地址
cnt2:
cmp word [bx],0x8000
;cno word [bx],0
jae neg2 ;按无符号数进行比较,高于等于0x80意味是负数。转neg2执行
;jl neg2
inc ax ;正数数量加一
jmp pos2
neg2:
inc dx ;负数数量加一
pos2:
add bx,2 ;指向下一个要判断的数
loop cnt2
jmp $
times 510-($-$$) db 0
db 0x55,0xaa