7.34 王爽汇编语言(三十一)

中间笔记

为了防止子程序中使用到的寄存器和主程序中使用的寄存器冲突导致逻辑出错,解决办法是在子程序的开始将 子程序中所有用到的寄存器的内容都保存起来(可以用栈来保存),在子程序返回前再恢复。(详情关注:P205页) 示例程序如下:

; 将 data 数据段中每个字符串转化为大写,字符串以 0 结尾
assume cs:code

data segment

    db 'word', 0
    db 'unix', 0
    db 'wind', 0
    db 'good', 0

data ends

stack segment

    dw 8 dup(0)

stack ends

code segment

main:
    mov ax, data
    mov ds, ax      ; 初始化 ds 寄存器

    mov ax, stack
    mov ss, ax      
    mov sp, 16      ; 初始化栈顶指针

    mov bx, 0       ; 用 bx 寄存器临时保存 si 的值
    mov cx, 4
s:
    mov si, bx      ; ds:[si] 指向 data 数据段
    call capital    ; 调用 capital 函数
    add bx, 5       ; 让 ds:[si] 指向下一个字符串开头字符
    loop s

    mov ax, 4c00h
    int 21h

capital:
    push cx         ; 首先将子程序中要使用到的寄存器值入栈
    push si

change:
    mov cl, [si]    ; 将数据段的单个字节保存到 cl 寄存器中
    mov ch, 0
    jcxz ok         ; 如果 cx 寄存器为 0,则返回
    and byte ptr [si], 11011111b    ; 转化为大写
    inc si
    jmp short change

ok:
    pop si
    pop cx           ; 恢复子程序中使用到的的寄存器值
    ret

code ends

end main

总结

嗯~,继续下节做实验 10

Last Updated:
Contributors: Hunter-0x07