|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 rooaw 于 2021-1-7 14:51 编辑
整理了一下书上完整代码如下:
- assume cs:code
- data segment
- db 'word', 0
- db 'word', 0
- db 'word', 0
- db 'word', 0
- data ends
- code segment
- start:
- mov ax, data
- mov ds, ax
- mov bx, 0 ;ds:[bx]字符串地址
- mov cx, 4 ;四组字符串
- s: mov si, bx ;从第1个字符开始
- call capital ;capital用于将当前一组字符串改为大写
- add bx, 5 ;到下一组字符串
- loop s
- mov ax, 4c00h
- int 21h
- capital: push cx ;cx表示循环到了第几组
- push si ;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 ;跳转到s循环里add bx, 5指令
- code ends
- end start
复制代码
第一个疑惑是 si 寄存器为什么需要入栈(27行)?不管 pop si 后 si 的值为多少,都会回到循环开头被 bx 赋值(18行)不是吗?
第二个疑惑是 change 标号那段其实就是个循环,只是因为 cx 要被占用无法用来记循环次数,所以不好写成 loop,而是用的 jmp 转移?
本帖最后由 jackz007 于 2021-1-7 17:30 编辑
- assume ds:data , es:data , cs:code
- stack segment stack para 'stack'
- dw 800h dup(00)
- stack ends
- data segment public para 'data'
- msg1 db 'word' , 00
- msg2 db 'word' , 00
- msg3 db 'word' , 00
- msg4 db 'word' , 00
- data ends
- code segment public para 'code'
- captal proc near
- cmp al , 'a'
- jb cap01
- cmp al , 'z'
- ja cap01
- sub al , ' '
- cap01: ret
- captal endp
- main proc far
- mov ax,data
- mov ds,ax
- mov es,ax
- mov bx,offset msg1 - 5
- mov cx,4
- cld
- m1: add bx,5
- mov si,bx
- mov di,bx
- m2: lodsb
- or al,al
- jz m3
- call captal
- stosb
- jmp m2
- m3: loop m1
- mov ax,04c00h
- int 021h
- main endp
- code ends
- end main
复制代码
|
|