实验 | 《汇编语言(王爽)》

实验一:查看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)。

;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
View Code

  2.编程,向内存0:200-0:23F依次传送数据0~63(3FH),只能使用9条指令。

;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
View Code

 3.补全下面的程序,其功能是将“mov ax,4c00”之前的指令复制到内存0:200处。

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
View Code

  

  PS:指令的段地址是放在CS里面,所以第一个空是“cs”,由图可以看出这些代码一共长15h,但是cx要赋值17h

实验5 编写、调试具体多个段的程序

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

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
View Code

6)

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
View Code

 

实验六:实践课程中的程序

(1)7.1

;程序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
View Code

 

(2)7.4

;大小写转换 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
View Code

 


问题8.1:【图片里的代码没有打完整,等我截完图才发现,懒得改了Orz】

;问题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
View Code


实验七:【总算是撸出来了好开心,这里要感谢一位师傅,在自闭的时候给了我冷静】

;实验七
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
View Code


 实验八:

八没啥好说的,直接debug一下就可以了,值得一提的是jmp放的是偏移地址,而且 “ -u ” 的时候,要加 “ 0 ”才会显示start前的指令


实验九:显示绿色、红底绿色、白底蓝色的welcome to masm!

  • 我先用python脚本写出了“welcome.....”的十六进制表示
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(",")))
View Code
  •  然后再是写asm
;实验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
View Code

 

 

 

 


10.10 参数和结果传递的问题

这里我改了一下代码   mov [di].2,dx    的时候居然报错有点迷

;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
View Code


 

 10.11 批量数据的传递

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
View Code

 

转载于:https://www.cnblogs.com/chrysanthemum/p/11456457.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值