汇编检测点
本帖最后由 1518610955 于 2024-11-26 16:20 编辑个人汇总,到11章为止 不都有答案了吗,几个意思? jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?
想做一份自己的
请问您需要关于汇编检测点1.1的具体帮助吗?如果有代码或具体问题,请提供更多信息,我会尽力帮助您。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 {:10_266:}{:10_256:}{:10_256:}全是考点 学习温故知新 1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。
2.30386读取次数:
1024÷(32÷8)=256次,以为一个字节是8位。 1518610955 发表于 2024-11-4 09:14
1.1补充
1.8086读取次数:
1024÷(16÷8)=512次,以为一个字节是8位。
2.2补充
给定段地址SA,和上面题目差不多,最大肯定是偏移地址为0,即2000H
若让偏移地址最大,为FFFFH,则结果是10001H,这样前16位是1000H,1会被舍去,所以我们取1001H,这样不至于让偏移地址为最大FFFFH都无法到20000H
1518610955 发表于 2024-11-4 10:16
2.2补充
给定段地址SA,和上面题目差不多,最大肯定是偏移地址为0,即2000H
若让偏移地址最大,为FFFFH,则 ...
2.3补充
ip每次增加,大小为所执行指令的长度 实验五补充
(5)
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
so segment
db 0,0,0,0,0,0,0,0
so ends
code segment
start:mov ax, a
mov ds, ax
mov ax, b
mov es, ax
mov ax, so
mov ss, ax
mov bx, 0
mov cx, 8
s:
mov ax,ds:
mov ss:, ax
mov ax, es:
add ss:, ax
inc bx
loop s
mov ax, 4c00H
int 21H
code ends
end start
(6)
assume cs: code
a segment
dw 1,2,3,4,5,6,7,8
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start:mov ax,a
mov ds, ax
mov ax, b
mov bx, 0
mov ss, ax
mov sp, 10H
mov cx, 8
s:push
add bx,2
loop s
mov ax, 4c00H
int 21H
code ends
end start
实验六补充
assume cs:codesg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:mov ax, stacksg
mov ss, ax
mov sp, 16 ;初始化栈
mov ax, datasg
mov ds, ax
mov bx, 0 ;定义行
mov cx,4
s1: push cx
mov si, 0
mov cx, 4
s2: mov al, ;使用al上面定义的数据单元为字节 db 不是 dw 。
and al, 11011111B
mov , al
inc si
loop s2
add bx, 16
pop cx
loop s1
mov ax, 4c00H
int 21H
codesg ends
end start 实验7补充
assume cs:code, ds:data, ds:table
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
db 21 dup ( 'year summ ne ?? ')
table ends
code segment
start:mov ax, data
mov ds, ax
mov ax, table
mov es, ax
mov di, 0
mov bx, 0
mov si, 0
mov cx, 21
s: mov ax, ds:
mov dx, ds:2H
mov es:, ax
mov es:2H, dx ;yeas
mov ax, ds:54H
mov dx, ds:56H
mov es:5H, ax
mov es:7H, dx ;总工资
div word ptr ds:0A8H
mov es:0DH, ax ;平均工资
mov ax, ds:0A8H
mov es:0aH, ax ;人数
add di, 2
add bx, 4
add si, 16
loop s
mov ax, 4c00H
int 21H
code ends
end start
设置两个段寄存器,分别指向数据和表,
数据中有类数据,分别记录其第一个数据的相对地址,方便后期寻址idata
数据中,分别以dd,db,dw存放数据,其中db放入字符串,将一个年份数据相当于一个整体,以此设置偏移量,di,si,和寄存器bx,来记录,以此在循环中的正确寻址
最后,按要求循环分别寻址打印即可
实验9代码
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h; 要求的三个颜色对应的16进制代码
data ends
stack segment
db 16 dup(0)
; 也可以是下面的定义法:
; dw 8 dup(0)
stack ends
code segment
start:
; 设置data段,以及ds:bx指向data段的第一个单元,
; 即ds:的内容就是data段第一个单元的内容
mov ax,data
mov ds,ax
;设置显示缓存区段
mov ax,0b800h ;设置起始缓存
mov es,ax
;设置栈段
mov ax,stack
mov ss,ax
mov sp,10h;指向栈顶
;初始化三个寄存器
mov bx,780h ; 行 从12-14行(注意:从第1行开始计数)
mov si,10h ; 颜色的偏移量,三次循环每次
; 增加 1h 指向下一个颜色
mov cx,3 ; 三次循环改变行
s: mov ah,ds: ;颜色事先存放在ah中
push cx
push si
mov cx,16; 16次循环改变列
mov si,64; 这里的si的意义是多少列,
; 为什么从64列开始呢?
; (1)字符串为32字节,16字节ASCLL码,16字节属性
; (2)每一行有160列,那么余下有 160-32=128列为空白
; 要使得字符串居中显示,那么字符串的左边和右边
; 都应该是64字节(128/2),而列数是从0开始计数,
; 所以左边的64字节为0-63,所以这里偏移量为64
mov di,0
s0: mov al,ds: ;将date段中的字符一个一个传入es中
mov es:,al ; 低位存放字符
mov es:,ah ; 高位存放颜色
add si,2;显示缓存区字符ASCII码偏移量为2
add di,1;data段字符的偏移量,每次加 1
loop s0
pop si
pop cx;后进先出,先出栈si,再出栈cx
add si,1h;指向下一个颜色
add bx,0a0h ;指向下一行 160=0a0h
loop s
mov ax,4c00h
int 21h
code ends
end start 汇编检测点10.5补充
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16 ;空栈
mov ds,ax ;寄存器DS指向栈的段地址
mov ax,0
call word ptr ds:
;首先执行push IP(下一条inc的偏移地址),此时SP=0EH;再执行jmp word ptr ds:,目的偏移地址由ds:给出
;因为DS和SS指向同一片内存,且(SP)=0EH,所以ds:相当于栈顶元素IP的值,即(IP)=(IP),程序顺序执行
inc ax ;ax=1
inc ax ;ax=2
inc ax ;ax=3
code ends
assume cs:code
data segment
dw 8 dup (0)
data ends
code segment
start:
mov ax,data
mov ss,ax
mov sp,16 ;空栈,大小为16字节
mov word ptr ss:, offset s
;将标号s处的偏移地址赋值到ss:中,即栈的第8个字
mov ss:,cs
;将寄存器CS的内容(标号s处的段地址)赋值到ss:中,即栈的第7个字
call dword ptr ss:
;首先执行push CS和push IP(后一指令nop的CS和IP),此时SP=0CH
;再执行jmp dword ptr ss:,目的地址由ss:高地址(标号s处指令的段地址)给出、偏移地址由ss:低地址(标号s处指令的偏移地址)给出
;所以,此时的jmp dword ptr ss:的功能是跳转到标号s处执行
nop
s:
mov ax,offset s ;将标号s处的偏移地址赋值到AX
sub ax,ss:
;ax=ax-ss:,ss:的值为栈顶元素,即nop指令的偏移地址,即s.IP-nop.IP为nop指令长度,即为1
mov bx,cs
sub bx,ss:
;bx=bx-ss:,ss:的值为第二栈顶元素,即nop指令的段地址,即cs-nop.CS,即为0
code ends
end start
补充汇编实验10:
1. (dh)=行号(0-24取值范围);(dl)=列号(0-79取值范围);(cl)=颜色(是一个二进制排列组合的值);ds:si指向字符串的首地址。
2. 行偏移量为80*2=160 列偏移量为1*2=2 相加得总偏移量
3. 字符显示:字符+属性字符放低位(cl)|属性放高位(ch)
4.循环打印
assume cs:code
data segment
db 'Welcome to masm!', 0 ;内存data段中定义一个字符串
data ends
code segment
main: ;字符串参数
mov dh, 8 ;屏幕的行数
mov dl, 3 ;所在行的列数
mov ch, 0 ;ch清零,防止高8位不为零。
mov cl, 2 ;颜色属性(此处应是二进制数0000 0010)
mov ax, data
mov ds, ax
mov si, 0 ;将ds:si指向字符串
call show_str
mov ax, 4c00H
int 21H
;show_str功能 :按行和列及字符属性显示字符串
;入口参数:dh-行数、dl-列数、cl-字符属性、ds:指向字符串。
;返回值:无
show_str: push dx
push cx
push si ;将子程序用到的寄存器入栈
mov ax, 0b800H
mov es, ax ;设置显示缓冲区内存段
mov ax, 0 ;(ax)= 0,防止高位不为零
mov al, 160 ;0a0H- 160字节/行
dec dh
mul dh ;相对于0b800:0000第dh行偏移量
mov bx, ax ;将第(dh)行的偏移地址送入bx,bx代表行偏移
mov ax, 0
mov al, 2 ;列的标准偏移量是2个字节
mul dl ;同一行列的偏移量,尽量使用乘法,(al)=列偏移
add bx, ax ;最终获得偏移地址(bx)=506H
mov di,0 ;将di作为每个字符的偏移量
mov al, cl ;将字符属性写入al中
mov ch, 0 ;将cx高8位设置为0
show: mov cl, ds: ;将字符串单个字符读入cl中
jcxz ok ;判断字符串是否为零。
mov es:, cl ;在显示缓冲区中写入字符
mov es:, al ;在显示缓冲区中写入字符属性
add di, 2
inc si
jmp short show
ok: pop si ;字符串字符为0,结尾
pop dx
pop cx ;恢复寄存器
ret
code ends
end main 汇编检实验10.2补充:
1.明白div的运算后商和余数放置位置
2.利用栈保存低位数值,先运算高位,用bx暂存高位商
3.全部取出,放入对应的寄存器中
assume cs:code
code segment
start:
mov ax, 4240H ;被除数,低16位
mov dx, 000FH ;被除数,高16位
mov cx, 0AH ;除数
call divdw ;调用divdw子程序,做不溢出的除法运算。
mov ax, 4c00H
int 21H
divdw: ;子程序开始
push ax ;将被除数低16位先压栈保存。
mov ax, dx ;(ax)=(dx)
mov dx, 0000H ;初始化
div cx ;此时(dx)=0000H,(ax)=000FH,组合成0000000FH。
mov bx, ax ;将H/N结果的商先保存在bx中,(bx)=0001H
pop ax ;将L值弹栈到ax
div cx ;此时(dx)=0005H,(ax)=4240H,组合成54240H
mov cx, dx ;返回值(cx)等于最终结果的余数
mov dx, bx ;最终结果高16位值=(bx)
ret
code ends
end start 参考链接:https://blog.51cto.com/u_14724733/5978476 jackz007 发表于 2024-11-1 15:53
不都有答案了吗,几个意思?
感谢哥10.5一直看不懂,第一个为什么ip为什么是oe怎么来的啊
页:
[1]