| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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
 
  复制代码 
 
 
 |   
 
 
 
 |