先运行代码1,再运行代码2,要利用虚拟机代码1
assume cs:code
code segment
NewStart1:jmp short NewStart2
db '1) reset pc ',0
db '2) start system ',0
db '3) clock ',0
db '4) set clock ',0
s5 dw 8 dup (0)
s6 db "aaaa/aa/aa aa:aa:aa",0
NewStart2:mov bx,200h
mov ds,bx
mov bx,0b800h
mov es,bx
mov si,2
mov bp,160*10+30*2
mov cx,4
show:push cx
mov di,0
mov cx,16
show1:mov al,ds:[si]
mov es:[bp+di],al
add di,2
inc si
loop show1
pop cx
add bp,158
loop show
mov bx,66
mov word ptr ds:[bx],0
mov word ptr ds:[bx+2],0ffffh
ccc:mov ah,0
int 16h
cmp al,'1'
je reset
cmp al,'2'
je startsystem
cmp al,'3'
je clock
cmp al,'4'
je setclock
jmp ccc
reset:mov bx,200h
mov ds,bx
mov bx,66
jmp dword ptr ds:[bx] startsystem:mov bx,0
mov es,bx
mov bx,7c00h
mov dl,80h
mov dh,0
mov ch,0
mov cl,1
mov al,1
mov ah,2
int 13h
mov bx,0
push bx
mov bx,7c00h
push bx
retf
setclock:jmp short setclock1
b db 'aaaaaaaaaaaaaa' setclock1:
push ax
push si
push ds
push dx
mov ax,200h
mov ds,ax
mov si,offset b
mov dx,0
call getstr
call str
pop dx
pop ds
pop si
pop ax
call cls
jmp near ptr NewStart1
clock:call cls
mov bx,200h
mov ds,bx
mov bx,0
mov es,bx
mov bx,66
push es:[9*4]
pop ds:[bx+10]
push es:[9*4+2]
pop ds:[bx+12]
cli
mov word ptr es:[9*4],offset int9
mov es:[9*4+2],ds
sti
s4:mov si,offset s6
mov al,32h
call s
mov [si],ah
mov [si+1],al
add si,2
mov al,9
mov cx,3
s1:mov bl,al
call s
mov [si],ah
mov [si+1],al
add si,3
mov al,bl
dec al
loop s1
mov si,offset s6
add si,11
mov al,4
mov cx,3
s2:mov bl,al
call s
mov [si],ah
mov [si+1],al
add si,3
mov al,bl
sub al,2
loop s2
mov bx,0b800h
mov es,bx
mov si,offset s6
mov di,160*6+40*2
mov cx,19
s3:mov bl,[si]
mov es:[di],bl
inc si
add di,2
loop s3
jmp short s4
s:push cx
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
pop cx
ret
cls:push es
push bx
push cx
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
s10:mov byte ptr es:[bx],' '
add bx,2
loop s10
pop cx
pop bx
pop es
ret
int9:push ax
push bx
push es
push cx
mov bx,200h
mov ds,bx
mov ax,0b800h
mov es,ax
mov bx,66
in al,60h
pushf
call dword ptr ds:[bx+10]
cmp al,3bh
jne ok1
mov bx,160*6+40*2+1
mov cx,19
s7:inc byte ptr es:[bx]
add bx,2
loop s7
ok2:pop cx
pop es
pop bx
pop ax
iret
ok1:cmp al,01
jne ok2
mov ax,0
mov es,ax
mov bx,66
cli
push ds:[bx+10]
pop es:[9*4]
push ds:[bx+12]
pop es:[9*4+2]
sti
pop cx
pop es
pop bx
pop ax
mov bp,0b800h
mov es,bp
mov bx,160*6+40*2
mov cx,19
s8:mov byte ptr es:[bx],' '
add bx,2
loop s8
mov ax,200h
push ax
mov ax,0
push ax
retf
charstack:jmp short charstart
table dw charpush,charpop,charshow charstart:push bx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]
charpush:mov bx,dx
mov [si][bx],al
inc dx
jmp sret
charpop:cmp dx,0
je sret
dec dx
mov bx,dx
mov al,[si][bx]
jmp sret
charshow:mov bx,0b800h
mov es,bx
mov di,160*6+40*2
charshows:cmp bx,dx
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty:mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret:pop es
pop di
pop bx
ret
getstr:push ax
getstrs:mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs
nochar:cmp ah,0eh
je backspace
cmp ah,1ch
je enter
jmp getstrs
backspace:mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enter:mov al,0
call charstack
mov ah,2
call charstack
pop ax
ret
wrtc:push cx
out 70h,al
mov ah,b[bx]
sub ah,30h
mov cl,4
shl ah,cl
inc bx
mov al,b[bx]
sub al,30h
or al,ah
out 71h,al
inc bx
pop cx
ret
str:push ax
push bx
mov bx,0
mov al,32h
call wrtc
mov al,9
call wrtc
mov al,8
call wrtc
mov al,7
call wrtc
mov al,4
call wrtc
mov al,2
call wrtc
mov al,0
call wrtc
pop bx
pop ax
ret
start:push cs
pop es
mov bx,offset NewStart1
mov al,16
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21h
code ends
end start
代码2
assume cs:code
code segment
NewStart1:jmp short NewStart2
dw 0,0
NewStart2:mov bx,200h
mov es,bx
mov bx,0
mov al,16
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
mov ax,0
mov es,ax
mov word ptr es:[7c04h],200h
jmp dword ptr es:[7c02h] start:push cs
pop es
mov bx,offset NewStart1
mov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21h
code ends
end start
第1章基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。 (2)1KB的存储器有1024个存储单元。存储单元的编号从0到1023。 (3)1KB的存储器可以存储1024*8个bit,1024个Byte。 (4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。(n^m的意思是n的m次幂) (5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 第2章寄存器答案 检测点2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H (2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点2.2 (1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。 (2) 有一数据存放在内存 20000H 单元中,先给定段地址为SA,若想用偏移地址寻到此单元。
第一章基础知识 检测点(第8页) ---------------------- (1) 13 (2) 1024,0,1023 (3) 8192,1024 (4) 2^30,2^20,2^10 (5) 64,1,16,4 (6) 1,1,2,2,4 (7) 512,256 (8) 二进制 注意: 1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方) 第二章寄存器(CPU工作原理) 检测点(第18页) ---------------------- (1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H 第二空:31A3H 第三空:3123H 第四空:6246H 第五空:826CH 第六空:6246H 第七空:826CH 第八空:04D8H 第九空:0482H 第十空:6C82H 第十一空:D882H 第十二空:D888H 第十三空:D810H 第十四空:6246H (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点(第23页) ---------------------- (1)00010H,1000FH (2)1001H,2000H 第2题说明: 因为段的起始地址要为16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。 检测点(第33页) ----------------------答:CPU修改了4次IP的值。 情况如下: 第1次:执行完mov ax,bx后 第2次:执行完sub ax,ax后 第3次:读入jmp ax后 第4次:执行完jmp ax后 最后IP的值为0 实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页) ----------------------------------------------------- 1.预备知识:Debug的使用 <此部分略> 2.实验任务(第43页) (1) <此部分略> (2) <此部分略> (3) 通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围> 第三章寄存器(内存访问) 检测点(第52页) ---------------------- (1)(题目:略) 第一空:2662H 第二空:E626H 第三空:E626H 第四空:2662H 第五空:D6E6H 第六空:FD48H 第七空:2C14H 第八空:0000H 第九空:00E6H 第十空:0000H 第十一空:0026H 第十二空:000CH 提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。
0000:0203 8ED8 MOV DS,AX 0000:0205 B82000 MOV AX,0020 0000:0208 8EC0 MOV ES,AX 0000:020A BB0000 MOV BX,0000 0000:020D B91800 MOV CX,0018 0000:0210 8A07 MOV AL,[BX] 0000:0212 26 ES: 0000:0213 8807 MOV [BX],AL 0000:0215 43 INC BX 0000:0216 E2F8 LOOP 0210 0000:0218 0000 ADD [BX+SI],AL 0000:021A 0000 ADD [BX+SI],AL 0000:021C 0000 ADD [BX+SI],AL 0000:021E 0000 ADD [BX+SI],AL -q 检测点6.1 (1) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序: assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h start: mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: mov ax,[bx]
mov cs:[bx],ax add bx,2 loop s mov ax,4c00h int 21h codesg ends end start (2) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序: assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0 ;10个字单元用栈空间 start: mov ax,cs mov ss,ax mov sp,36 mov ax,0 mov ds,ax mov bx,0 mov cx,8 s: push [bx]
解题过程: 物理地址=SA*16+EA 20000h=SA*16+EA SA=(20000h-EA)/16=2000h-EA/16 EA取最大值时,SA=2000h-ffffh/16=1001h,SA为最小值 EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值 这里的ffffH/16=fffh是通过WIN自带计算器算的 按位移来算确实应该为fff.fh,这里小数点后的f应该是省略了 单就除法来说,应有商和余数,但此题要求的是地址最大和最小,所以余数忽略了 如果根据位移的算法(段地址*16=16进制左移一位),小数点后应该是不能省略的 我们可以反过来再思考下,如果SA为1000h的话,小数点后省略 SA=1000h,EA取最大ffffh,物理地址为1ffffh,将无法寻到20000H单元 这道题不应看成是单纯的计算题 检测点2.3 下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少? mov ax,bx sub ax,ax jmp ax 答:一共修改四次 第一次:读取mov ax,bx之后 第二次:读取sub ax,ax之后 第三次:读取jmp ax之后 第四次:执行jmp ax修改IP 最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H 实验一查看CPU和内存,用机器指令和汇编指令编程 2实验任务 (1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。 机器码汇编指令寄存器 b8 20 4e mov ax,4E20H ax=4E20H 05 16 14 add ax,1416H ax=6236H bb 00 20 mov BX,2000H bx=2000H
第一章基础知识 检测点1.1(第8页) ---------------------- (1) 13 (2) 1024,0,1023 (3) 8192,1024 (4) 2^30,2^20,2^10 (5) 64,1,16,4 (6) 1,1,2,2,4 (7) 512,256 (8) 二进制 注意: 1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方) 第二章寄存器(CPU工作原理) 检测点2.1(第18页) ---------------------- (1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H 第二空:31A3H 第三空:3123H 第四空:6246H 第五空:826CH 第六空:6246H 第七空:826CH 第八空:04D8H 第九空:0482H 第十空:6C82H 第十一空:D882H 第十二空:D888H 第十三空:D810H 第十四空:6246H (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点2.2(第23页) ---------------------- (1)00010H,1000FH (2)1001H,2000H 第2题说明: 因为段的起始地址要为16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。 检测点2.3(第33页) ----------------------答:CPU修改了4次IP的值。 情况如下: 第1次:执行完mov ax,bx后 第2次:执行完sub ax,ax后 第3次:读入jmp ax后 第4次:执行完jmp ax后 最后IP的值为0 实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页) ----------------------------------------------------- 1.预备知识:Debug的使用 <此部分略> 2.实验任务(第43页) (1) <此部分略> (2) <此部分略> (3) 通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围> 第三章寄存器(内存访问) 检测点3.1(第52页) ---------------------- (1)(题目:略) 第一空:2662H 第二空:E626H 第三空:E626H 第四空:2662H 第五空:D6E6H 第六空:FD48H 第七空:2C14H 第八空:0000H 第九空:00E6H 第十空:0000H 第十一空:0026H 第十二空:000CH 提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。
检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB的存储器可以存储 8192(2^13)个bit, 1024个Byte。 (4)1GB是 1073741824 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为:64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。(7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。(8)在存储器中,数据和程序以二进制形式存放。 解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理 1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。 检测点2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H
AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0005 NV UP EI PL NZ NA PO NC 2000:0005 EBFC JMP 0003 -t AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=2000 IP=0003 NV UP EI PL NZ NA PO NC 2000:0003 01C0 ADD AX,AX -q 实验一查看CPU和内存,用机器指令和汇编指令编程 (3) 查看内存中的内容 PC主板上的ROM中有个一出产日期,在内存FFF00H-FFFFFH的某几个单元中,请找到这个出产日期并试图改变它。 Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\DOCUME~1\ADMINI~1>debug -d ffff:0 f FFFF:0000 EA 5B E0 00 F0 31 32 2F-32 35 2F 30 37 00 FC 59 .[...12/25/07..Y -q 地址C0000~FFFFF的内存单元为只读存储器,写入数据操作是无效的。 因此出产日期无法改变。 下面内容摘自于网上 还有另一种情况,如果你发现你能修改ROM中的生产日期,那么原因如下: 每个计算机的结构都不一样,教材考虑的是普通8086PC机上的效果,个别计算机的效果可能不同。 也就是说在你的计算机中这个内存是可修改的 所以,认为所有的计算机某些地址的内存不能修改是片面的。 书上说rom是只读的你就不去验证了吗?如何验证呢? 我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神,怀疑之后再去验证才能跟深刻的理解知识,提升自己的能力,甚至还会发现有些书上描述的不准确甚至错误的地方。
01 d8 add ax,bx ax=8236H 89 c3 mov bx,ax bx=8236H 01 d8 add ax,bx ax=046CH b8 1a 00 mov ax,001AH ax=001AH bb 26 00 mov bx,0026H bx=0026H 00 d8 add al,bl ax=0040H 00 dc add ah,bl ax=2640H 00 c7 add bh,al bx=4026H b4 00 mov ah,0 ax=0040H 00 d8 add al,bl ax=0066H 04 9c add al,9CH ax=0002H Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\DOCUME~1\ADMINI~1>debug -a 0C1C:0100 mov ax,4e20 0C1C:0103 add ax,1416 0C1C:0106 mov bx,2000 0C1C:0109 add ax,bx 0C1C:010B mov bx,ax 0C1C:010D add ax,bx 0C1C:010F mov ax,001a 0C1C:0112 mov bx,0026 0C1C:0115 add al,bl 0C1C:0117 add ah,bl 0C1C:0119 add bh,al 0C1C:011B mov ah,0 0C1C:011D add al,bl 0C1C:011F add al,9c 0C1C:0121 -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC 0C1C:0100 B8204E MOV AX,4E20
薈芃莃肆蒀膁蚃第1章基础知识 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13。 (2)1KB的存储器有1024个存储单元。存储单元的编号从0到1023。 (3)1KB的存储器可以存储1024*8个bit,1024个Byte。 (4)1GB、1MB、1KB分别是2^30、2^20、2^10 Byte。(n^m的意思是n的m次幂) (5)8080、8088、80286、80386的地址总线宽度分别是16根、20根、24根、32根,则它们的寻址能力分别为:64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为:1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次、80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 莅羈膇膃蚅莅聿第2章寄存器答案 检测点2.1 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H mov al,23H AX=3123H add ax,ax AX=6246H mov bx,826CH BX=826CH mov cx,ax CX=6246H mov ax,bx AX=826CH add ax,bx AX=04D8H mov al,bh AX=0482H mov ah,bl AX=6C82H add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H (2) 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点2.2 (1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH。 (2) 有一数据存放在内存 20000H 单元中,先给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为1001H,最大为2000H。 检测点2.3
0C1C:0117 00DC ADD AH,BL -t AX=2640 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0119 NV UP EI PL NZ NA PO NC 0C1C:0119 00C7 ADD BH,AL -t AX=2640 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011B NV UP EI PL NZ NA PO NC 0C1C:011B B400 MOV AH,00 -t AX=0040 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011D NV UP EI PL NZ NA PO NC 0C1C:011D 00D8 ADD AL,BL -t AX=0066 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=011F NV UP EI PL NZ NA PE NC 0C1C:011F 049C ADD AL,9C -t AX=0002 BX=4026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0121 NV UP EI PL NZ AC PO CY 0C1C:0121 D3990075 RCR WORD PTR [BX+DI+7500],CL DS:B526=0000 -q 实验一查看CPU和内存,用机器指令和汇编指令编程 (2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。 mov ax,1 add ax,ax jmp 2000:0003 Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\DOCUME~1\ADMINI~1>debug -a 2000:0 2000:0000 mov ax,1 2000:0003 add ax,ax 2000:0005 jmp 2000:0003
-t AX=4E20 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC 0C1C:0103 051614 ADD AX,1416 -t AX=6236 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0106 NV UP EI PL NZ NA PE NC 0C1C:0106 BB0020 MOV BX,2000 -t AX=6236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0109 NV UP EI PL NZ NA PE NC 0C1C:0109 01D8 ADD AX,BX -t AX=8236 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010B OV UP EI NG NZ NA PE NC 0C1C:010B 89C3 MOV BX,AX -t AX=8236 BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010D OV UP EI NG NZ NA PE NC 0C1C:010D 01D8 ADD AX,BX -t AX=046C BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=010F OV UP EI PL NZ NA PE CY 0C1C:010F B81A00 MOV AX,001A -t AX=001A BX=8236 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0112 OV UP EI PL NZ NA PE CY 0C1C:0112 BB2600 MOV BX,0026 -t AX=001A BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0115 OV UP EI PL NZ NA PE CY 0C1C:0115 00D8 ADD AL,BL -t AX=0040 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0117 NV UP EI PL NZ AC PO NC
--引用这几本书综合研究的三个问题: 都再用,我们就非得用吗? 规定了,我们就只知道遵守吗? 司空见惯,我们就不怀疑了吗? 尽信书不如无书大概也有这个道理吧^_^ 检测点3.1 (1) 在DEBUG中,用"D 0:0 lf" 查看内存,结果如下: 0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60 0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88 下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完后相关寄存器中的值mov ax,1 mov ds,ax mov ax,[0000] ax= 2662H mov bx,[0001] bx= E626H mov ax,bx ax= E626H mov ax,[0000] ax= 2662H mov bx,[0002] bx= D6E6H add ax,bx ax= FD48H add ax,[0004] ax= 2C14H mov ax,0 ax= 0 mov al,[0002] ax= 00e6H mov bx,0 bx= 0 mov bl,[000c] bx= 0026H add al,bl ax= 000CH 用DEBUG进行验证: Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\DOCUME~1\000>debug -e 0000:0 0000:0000 68.70 10.80 A7.f0 00.30 8B.ef 01.60 70.30 00.e2 0000:0008 16.00 00.80 AF.80 03.12 8B.66 01.20 70.22 00.60
DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC 0C1C:0100 B80200 MOV AX,0002 -t AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC 0C1C:0103 01C0 ADD AX,AX -t AX=0004 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC 0C1C:0105 01C0 ADD AX,AX -t AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0107 NV UP EI PL NZ NA PO NC 0C1C:0107 01C0 ADD AX,AX -t AX=0010 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0109 NV UP EI PL NZ AC PO NC 0C1C:0109 20881615 AND [BX+SI+1516],CL DS:1516=00 -q 检测点2.2 (1) 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH 。 解题过程: 物理地址=SA*16+EA EA的变化范围为0h~ffffh 物理地址范围为(SA*16+0h)~(SA*16+ffffh) 现在SA=0001h,那么寻址范围为 (0001h*16+0h)~(0001h*16+ffffh) =0010h~1000fh 检测点2.2 (2) 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为 1001H ,最大为 2000H 。 当段地址给定为 1001H 以下和2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
add ah,ah AX=D882H add al,6 AX=D888H add al,al AX=D810H mov ax,cx AX=6246H Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001. C:\DOCUME~1\ADMINI~1>debug -a 0C1C:0100 mov ax,f4a3 0C1C:0103 mov ah,31 0C1C:0105 mov al,23 0C1C:0107 add ax,ax 0C1C:0109 mov bx,826c 0C1C:010C mov cx,ax 0C1C:010E mov ax,bx 0C1C:0110 add ax,bx 0C1C:0112 mov al,bh 0C1C:0114 mov ah,bl 0C1C:0116 add ah,ah 0C1C:0118 add al,6 0C1C:011A add al,al 0C1C:011C mov ax,cx 0C1C:011E -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0100 NV UP EI PL NZ NA PO NC 0C1C:0100 B8A3F4 MOV AX,F4A3 -t AX=F4A3 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0103 NV UP EI PL NZ NA PO NC 0C1C:0103 B431 MOV AH,31 -t AX=31A3 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0C1C ES=0C1C SS=0C1C CS=0C1C IP=0105 NV UP EI PL NZ NA PO NC
汇编语言第二版答案-王爽 检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB的存储器可以存储 8192(2^13)个bit, 1024个Byte。 (4)1GB是 1073741824 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。 (7)从存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。 (8)在存储器中,数据和程序以二进制形式存放。 解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个存单元。(一个存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理 1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。 检测点 2.1
汇编语言实验报告 : 班级学号 学生姓名 提交日期 成 绩
实验1-1如下: 用E命令将指令写入内存:
用A命令将指令写入内存: 实验1-2代码如下: 用a命令在2000:0000处写如要写如的代码,然后用R命令来修改CS为2000,IP修改为0,然后用T命令执行,直到AX中的值为10,因为是默认为十六进制,所以ax中的0010实际代表十进制的16。如图:
实验1-3: 用D命令输入内存fff0h~fffffh,则可看到:
生产日期为06/15/09在地址为FFFF5~FFFF12处,现在用E命令随便修改一下有: 在window7下虚拟的dos中可以改,但如果重新打开dos中的debug则日期任然不会改变,因为那是ROM。 实验1-4代码如下:
内存地址为B800:0开始的为显存,是RAM,可以改变其值来在屏幕中显示,其中这一个字符占两个字节,前一个(低)为字符的ASCII码,后一个(高)为要显示的颜色,内存B800:0和B800:1这两个字节对应着屏幕中的第一个字符的位置,依次类推,每个屏幕的行有80个字符,对应的内存占160个字节 实验2-1:(按实验结果填空) Mov ax,ffff Mov ds,ax Mov ax,2200 Mov ss,ax Mov sp,0100 Mov ax,[0] ;ax=5BEA Add ax,[2] ;ax=5CCA Mov bx,[4] ;bx=30F0 Add bx,[6] ;bx=6026 Push ax ;sp=00FE; 修改的内存单元的地址是2200:00FE 内容是5CCA Push bx ;sp=00FC; 修改的内存单元的地址是2200:00FC内容是
汇编语言第二版答案-王爽 检测点 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。(2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到1023 。 (3)1KB的存储器可以存储 8192(2^13)个bit, 1024个Byte。(4)1GB是 24 (2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64 (KB)、 1 (MB)、16 (MB)、 4 (GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、1 (B)、 2 (B)、 2 (B)、 4 (B)。 (7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。 (8)在存储器中,数据和程序以二进制形式存放。
解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。(3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。(4)1GB=24B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。(7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。 检测点 (1) 写出每条汇编指令执行后相关寄存器中的值。 mov ax,62627 AX=F4A3H mov ah,31H AX=31A3H