汇编实验九

一.实验内容

1.完成在屏幕上输出内存单元中的十进制两位数

2.完成在屏幕上输出data段定义的5个十进制两位数,数据和数据之间以空格间隔

3.教材实验9:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串‘weclome to masm’

二.实验步骤

1.代码如下

; 在屏幕上输出内存单元中的十进制两位数
assume cs:code, ds:data
data segment
db 12
db ?,? ; 前一个字节用于保存商,后一个字节用于保存余数
data ends
code segment
start:
mov ax,data
mov ds,ax ; 补全指令,使得ds <-- data段地址

mov ah,0
mov al,ds:[0] ; ax <-- data段字节单元的被除数12
mov bl,10
div bl
mov ds:[1],al ; 补全代码,让商保存到data段注释中指定的单元
mov ds:[2],ah ; 补全代码,让余数保存到data段注释中指定的单元

mov ah,2
mov dl,ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值
add dl,30h ; 补全代码,使得dl中的数值转换为数字字符
int 21h

mov ah,2
mov dl,ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值
add dl,30h ; 补全代码,使得dl中的数值转换为数字字符 
int 21h

mov ax,4c00h
int 21h
code ends
end start

实验结果如下:

 

2.代码如下:

;完成在屏幕上输出data段定义的5个十进制两位数,数据和数据 之间以空格;间;隔。 
assume cs:code, ds:data
data segment
     db 12,35,96,55,67
data ends
code segment
start:
      ; 补全程序,参考t1.asm,综合应用以下知识完成:
      ; (1) loop指令、内存单元地址的灵活表示
      ; (2) div指令, 数字→数字字符的转换
      ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: 
      ;     mov ah,2
      ;     mov dl,待输出字符或其ASCⅡ码
      ;     int 21h
      ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符
      
      mov ax,data
      mov ds,ax
      mov si,0
      mov cx,5

S:   mov ah,0 
      mov al,ds:[si]
      mov bl,10
      div bl
   
      mov dl,al   
      mov dh,ah  

      mov ah,2
      add dl,30h
      int 21h

      mov ah,2
      mov dl,dh
      add dl,30h
      int 21h

      mov ah,2
      mov dl,0
      int 21h

      inc si
loop S
      mov ax,4c00h
      int 21h
code ends
end start

实验截图如下:

 

3.这题花费了不少时间 主要还犯了写低级错误  push  inc等后面竟然加了逗号

另外一开始考虑循环  没注意到有些值之间相互影响

尽量使用不同的寄存器

此外为了满足题目要求输出在屏幕中间 做了些基础的计算,但很粗糙

代码如下:

assume ds:data, cs:code,ss:stack
data segment
       db 'welcome to masm!'  
       db 2H,24H,71H        
data ends
stack segment
db 0
stack ends

code segment
start:  
        mov ax,data
        mov ds,ax  
        mov ax, stack
        mov ss,ax  
        
        mov ax,0b800H
        mov es,ax           
        mov bx,1920   
        mov si,0
        mov di,0

       mov cx,3
       mov bp,16
    

s:     push cx
       mov cx,16
       mov si,60
       mov di,0

s1:   mov al,ds:[di]
       mov es:[bx+si],al
       mov al,ds:[bp]
       mov es:[bx+si+1],al
       add si,2
       inc di
loop s1

       add bx,160
       inc bp
       pop cx

loop s

code ends
end start

运行截图如下:

在程序改bug过程中出现很多好玩的事

如屏幕持续刷新图像,出现各种颜色

这些都与写的循环有关

原文地址:https://www.cnblogs.com/wtblogwt/p/10073610.html