实验一:查看CPU和内存,用机器指令和汇编指令编程
(3) 在内存fff00H-fffffH的某几个单元中可以看到rom的生产日期
这里是2017年5月19日
(4)向b810写数据
在这里写入的数据都会显示在屏幕上
检测点3.1
(1)在Debug中,用“d 0:0 1f”查看内存,结果如下
实验二:用机器指令和汇编指令编程
(1)用debug,将下面的程序写入内存,逐条执行,根据指令执行后的实际运行情况填空
实验四:[bx]和loop的使用
1.编程,向内存0:200-0:23F依次传送数据0~63(3FH)。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;P121 第五章实验四 (1) assume cs:code code segment main: mov ax,0020h mov ds,ax ;指定段地址0200h mov bx,0h mov cx,003fh mov ax,0h s: mov [bx],al inc bx inc al loop s mov ax,4c00h int 21h code ends end main
2.编程,向内存0:200-0:23F依次传送数据0~63(3FH),只能使用9条指令。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;P121 第五章实验四 (2) assume cs:code code segment main: mov ax,0020h mov ds,ax ;指定段地址0200h mov bx,0h mov cx,003fh s:mov [bx],bl inc bl loop s mov ax,4c00h int 21h code ends end main
3.补全下面的程序,其功能是将“mov ax,4c00”之前的指令复制到内存0:200处。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
assume cs:code code segment main: mov ax,cs mov ds,ax mov ax,0020h mov es,ax ;es=0020 mov bx,0 mov cx,17h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end main
PS:指令的段地址是放在CS里面,所以第一个空是“cs”,由图可以看出这些代码一共长15h,但是cx要赋值17h
实验5 编写、调试具体多个段的程序
5)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;默认是一次记录到代码段中的 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: mov ax,a mov ds,ax mov ax,b mov es,ax mov bx,0 mov cx,8 s: mov al,ds:[bx] add es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end start
6)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
assume cs:code a segment dw 1,2,3,4,5,6,7,8,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment db 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,a mov ds,ax mov ax,b mov ss,ax mov sp,16 mov cx,8 mov bx,0 s: push ds:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
实验六:实践课程中的程序
(1)7.1
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;程序7.1 P 139 assume cs:code,ds:data data segment db 'unIX' db 'foRK' data ends code segment start: mov al,'a' mov bl,'b' mov ax,4c00h int 21h code ends end start
(2)7.4
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;大小写转换 P143 ; and or 的使用 assume cs:codesg,ds:datasg datasg segment db 'BaSiC' db 'iNforMaTiOn' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov bx,0 mov cx,5 ;第一个循环将第一段变成大写 s:mov al,[bx] and al,11011111B mov [bx],al inc bx loop s ;第二个循环将第二段变成小写 mov bx,5 mov cx,11 s0:mov al,[bx] or al,00100000B mov [bx],al inc bx loop s0 mov ax, 4c00h int 21h codesg ends end start
问题8.1:【图片里的代码没有打完整,等我截完图才发现,懒得改了Orz】
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;问题8.1 p 171 ; 100001 / 100 = 1000 …… 1 ; 186A1H / 64H = 3E8H …… 1 assume cs:code data segment dd 100001 ;186A1 64 dw 100 ;ax=86A1 dx=0001 6400 0000 dw 0 data ends code segment start: mov ax,data mov ds,axq mov ax,ds:[0] mov dx,ds:[2] ;ax=86A1 dx=0001 div word ptr ds:[4] mov ds:[6],ax mov ax,4c00h int 21h code ends end start
实验七:【总算是撸出来了好开心,这里要感谢一位师傅,在自闭的时候给了我冷静】
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;实验七 assume cs:codesg 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' ;年份:每一个一个4字节,4*21 【0-53H】 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;每一个一个4字节,4*21 【54H-0A7H】 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 ;员工数:每一个两个字节,2*21 【0A8H-H】 data ends table segment db 21 dup('year summ ne ?? ') table ends codesg segment start: mov ax,data mov ds,ax mov ax,table mov es,ax ;定义好了数据段 mov cx,21 mov bx,0 mov si,0 mov di,0 mov ax,0 mov ss,ax mov sp,2003H s: push cx mov ax,0[si] mov es:0[bx],ax mov ax,0[si+2] mov es:2[bx],ax ;年份赋值:每一次赋一个字,执行两次,完成四个字节的赋值,si来遍历年份 mov ax,54H[si] mov es:5[bx],ax mov ax,54H[si+2] mov es:7[bx],ax ;收入赋值:每一次赋一个字,执行两次,完成四个字节的赋值 mov ax,0A8H[di] mov es:10[bx],ax ;雇员赋值:每一次赋一个字,执行一次,完成两个字节的赋值 mov ax,54H[si] mov dx,54H[si+2] ;赋值被除数 mov cx,0A8H[di] div word ptr cx pop cx mov es:13[bx],al add bx,16 ;用bx控制行 add si,4 ;用si控制年份和收入 add di,2 ;用di控制雇员 loop s mov ax,4c00H int 21H codesg ends end start
实验八:
八没啥好说的,直接debug一下就可以了,值得一提的是jmp放的是偏移地址,而且 “ -u ” 的时候,要加 “ 0 ”才会显示start前的指令
实验九:显示绿色、红底绿色、白底蓝色的welcome to masm!
- 我先用python脚本写出了“welcome.....”的十六进制表示
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
u="welcome to masm!" strs="" # 绿字 # for i in u: # strs=strs+str(hex(ord(i)))[2:]+"h,"+"2h"+"," # print(strs) # print(len(strs.split(","))) # 绿地红字 # for i in u: # strs=strs+str(hex(ord(i)))[2:]+"h,"+"24h"+"," # print(strs) # print(len(strs.split(","))) # 3.白底蓝字 for i in u: strs=strs+str(hex(ord(i)))[2:]+"h,"+"0F1h"+"," print(strs) print(len(strs.split(",")))
- 然后再是写asm
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;实验9 assume cs:code data1 segment ;1.绿底字体 db 77h,2h,65h,2h,6ch,2h,63h,2h,6fh,2h,6dh,2h,65h,2h,20h,2h,74h,2h,6fh,2h,20h,2h,6dh,2h,61h,2h,73h,2h,6dh,2h,21h,2h data1 ends data2 segment ;2.绿底红字 db 77h,24h,65h,24h,6ch,24h,63h,24h,6fh,24h,6dh,24h,65h,24h,20h,24h,74h,24h,6fh,24h,20h,24h,6dh,24h,61h,24h,73h,24h,6dh,24h,21h,24h data2 ends data3 segment ;3.白底蓝字 db 77h,0F1h,65h,0F1h,6ch,0F1h,63h,0F1h,6fh,0F1h,6dh,0F1h,65h,0F1h,20h,0F1h,74h,0F1h,6fh,0F1h,20h,0F1h,6dh,0F1h,61h,0F1h,73h,0F1h,6dh,0F1h,21h,0F1h data3 ends code segment start: mov ax,0b800h mov ds,ax ;1.绿底字体 mov ax,data1 mov es,ax mov cx,32 mov bx,0 s1: mov al,es:[bx] mov ds:[bx+0a12h],al inc bx loop s1 ;2.绿底红字 mov ax,data2 mov es,ax mov cx,32 mov bx,0 s2: mov al,es:[bx] mov ds:[bx+0a32h],al inc bx loop s2 ;3.白底蓝字 mov ax,data3 mov es,ax mov cx,32 mov bx,0 s3: mov al,es:[bx] mov ds:[bx+0a52h],al inc bx loop s3 mov ax,4c00h int 21h code ends end start
10.10 参数和结果传递的问题
这里我改了一下代码 mov [di].2,dx 的时候居然报错有点迷
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
;P201 assume cs:code data segment dw 1,2,3,4,5,6,7,8 dd 0,0,0,0,0,0,0,0 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov di,16 mov cx,8 s: mov bx,[si] call cube mov [di],ax mov [di+2],dx add si,2 add di,4 loop s mov ax,4c00h int 21h cube: mov ax,bx mul bx mul bx ret code ends end start
10.11 批量数据的传递
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
assume cs:code data segment db 'conversation' data ends code segment start: mov ax,data mov ds,ax ;ds赋值 mov si,0 mov cx,12 ;设置循环体 call capital ;调用函数 mov ax,4c00h int 21h capital: and byte ptr [si],11011111b ;将字符转为大写 inc si loop capital ret code ends end start