实验9

t1

; 在屏幕上输出内存单元中的十进制两位数
assume cs:code, ds:data
data segment
     db 12
     db 0,0   ; 前一个字节用于保存商,后一个字节用于保存余数
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

t2

assume cs:code, ds:data, ss:stack
data segment
    db 12, 35, 96, 55, 67
data ends

stack segment
    dw 0,0
stack ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax
    mov sp, 0005h

    mov cx, 5
    mov si, 0
s1:
    push cx
    mov cx, 2
    mov di, 0

    mov ah, 0;
    mov al, [si]
    mov bl, 10
    div bl
    push ax
s2:
    mov ah, 2
    mov dl,ss:[di]
    add dl, 30h
    int 21h
    add di, 1
loop s2
    inc si
    pop ax
    pop cx

    mov ah, 2
    mov dl, ' '
    int 21h
loop s1

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

用了下栈,出了点问题

t3

assume ds:data, cs:code
data segment
       db 'welcome to masm!'
       db 2H,24H,71H          ;字符串属性值
data ends

code segment
start:  mov ax,data
        mov ds,ax            ;字符串及属性值所在段的段地址送入ds

        mov ax,0b800H
        mov es,ax            ;80×25彩色字符模式显示缓冲区段地址送入es

        mov si, 0
        mov di, 30h
        mov cx, 16

    s:
        mov al, ds:[si]
        mov byte ptr es:06E0h[di], al
        inc di
        mov al, ds:[10h]
        mov byte ptr es:06E0h[di], al
        inc di
        inc si
    loop s

        mov si, 0
        mov di, 30h
        mov cx, 16
    s1:
        mov al, ds:[si]
        mov byte ptr es:0780h[di], al
        inc di
        mov al, ds:[11h]
        mov byte ptr es:0780h[di], al
        inc di
        inc si
    loop s1

        mov si, 0
        mov di, 30h
        mov cx, 16
    s2:
        mov al, ds:[si]
        mov byte ptr es:0820h[di], al
        inc di
        mov al, ds:[12h]
        mov byte ptr es:0820[di], al ;繁版截图出现问题的地方
        inc di
        inc si
    loop s2

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

简洁后:

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            ;字符串及属性值所在段的段地址送入ds

        mov ax,0b800H
        mov es,ax            ;80×25彩色字符模式显示缓冲区段地址送入es

        mov ax, stack
        mov ss, ax
        mov sp, 2

        mov bx, 06E0h; 来控制行
        mov bp, 10h; 来控制色彩
        mov cx, 3
    s0:
        push cx
        mov si, 0
        mov di, 30h
        mov cx, 16
    s:
        mov al, ds:[si]
        mov byte ptr es:[bx][di], al
        inc di
        mov al, ds:[bp]
        mov byte ptr es:[bx][di], al
        inc di
        inc si
    loop s

        add bx, 0a0h
        inc bp
        pop cx
    loop s0

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

第一张图为繁版,第二张为简版

繁版出现问题的原因是:我在设置色彩属性时0820h 没有加h,导致色彩不对。

总结:

当知识掌握的不牢固的时候,debug是一件很痛苦的事情。

原文地址:https://www.cnblogs.com/sunguanglin/p/10097756.html