3.有字符串以0作为结尾符,定义如下 Data segment Db ‘conversation’,0 Data ends 有子程序如下 cap:mov cl,[si] mov ch,0 jcxz ok and byte ptr[si],11011111b inc si jmp short cap ok:ret (1)将data 段中字符串转化为大写 Mov ax,data Mov ds,ax Mov si,o Call cap (2) 将data段中的字符串全部转化为大写 Data segment Db ‘word’,0 Db ‘unix’,0 Db ‘wind’,0 Db ‘good’,0 Data ends 程序如下: Code segment Start:Mov ax,data Mov ds,ax Mov bx,0 Mov cx,4 s: mov si,bx Call cap Add bx,5 Loop s Mov sa,4c00h Int 21h cap:mov cl,[si] mov ch,0 jcxz ok and byte ptr[si],11011111b inc si jmp short cap ok:ret code ends end start 仔细阅读程序,发现有什么问题,如何避免。
时间: 2024-02-12 13:08:08 浏览: 24
在第二个程序中,循环的次数应该是5而不是4,因为有5个字符串需要转换。因此,第二个程序应该改为:
```
Code segment
Start:
Mov ax,data
Mov ds,ax
Mov bx,0
Mov cx,5 ; 将循环次数改为5
s:
mov si,bx
Call cap
Add bx,5
Loop s
Mov ah,4ch
Int 21h
cap:
mov cl,[si]
mov ch,0
jcxz ok
and byte ptr[si],11011111b
inc si
jmp short cap
ok:
ret
code ends
end start
```
为了避免这种问题,我们应该在编写程序时仔细检查循环次数和循环变量的范围,确保程序不会出现逻辑错误。同时,我们也可以使用常量来表示循环次数,这样可以避免手动计算出错的问题。
相关问题
写出完整程序,把一个字符串中的所有小写字母改为相应的大写字母,并显示出来,该字符串以‘$’结尾。该字符串定义如下: DATA SEGMENT STR DB ‘HELLO,everybody!$’ DATA ENDS
下面是一个示例程序,使用 x86 汇编语言编写,可以实现将字符串中的小写字母转换为大写字母:
```
.MODEL SMALL
.STACK 100H
.DATA
STR DB 'HELLO,everybody!$'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 将字符串中的小写字母转换为大写字母
LEA SI, STR
LOOP_START:
MOV AL, [SI]
CMP AL, '$'
JE LOOP_END
CMP AL, 'a'
JB NOT_LOWER_CASE
CMP AL, 'z'
JA NOT_LOWER_CASE
SUB AL, 32 ; 转换为大写字母
MOV [SI], AL
NOT_LOWER_CASE:
INC SI
JMP LOOP_START
LOOP_END:
; 显示转换后的字符串
LEA DX, STR
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
```
该程序使用了一个循环来遍历字符串中的每个字符,如果该字符是小写字母,则将其转换为相应的大写字母。最后,程序使用 DOS 的中断 21H 功能来显示转换后的字符串。
1. 写出完整程序,把一个字符串中的所有小写字母改为相应的大写字母,该字符串以‘$’结尾。该字符串定义如下: DATA SEGMENT STR DB ‘HELLO,everybody!$’ DATA ENDS2. 已知有一个首地址为BUF的数组,编写完整程序,计算数组中所有数值的和,并存放在TOTAL单元中,数据段定义如下: DATA SEGMENT BUF DW 56,47, 92,123,-45, 6, 87, -25, 31,19TOTAL DW ? DATA ENDS
1. 以下是一个将字符串中所有小写字母转换为大写字母的程序:
```
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
STR DB 'HELLO,everybody!$'
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
LEA SI, STR ; SI指向字符串的第一个字符
UPPERCASE:
MOV AL, [SI] ; 将当前字符存储在AL寄存器中
CMP AL, 'a' ; 如果当前字符是小写字母
JB NEXT ; 则跳转到下一个字符
CMP AL, 'z' ; 如果当前字符是小写字母
JA NEXT ; 则跳转到下一个字符
SUB AL, 32 ; 转换为大写字母
MOV [SI], AL ; 将转换后的字符存储回字符串中
NEXT:
INC SI ; 指向下一个字符
CMP BYTE PTR [SI], '$' ; 如果到达字符串末尾
JE EXIT ; 则跳转到程序结束
JMP UPPERCASE ; 继续处理下一个字符
EXIT:
MOV AH, 4CH ; DOS退出调用
INT 21H
CODE ENDS
END START
```
2. 以下是一个计算数组中所有值的和的程序:
```
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
BUF DW 56, 47, 92, 123, -45, 6, 87, -25, 31, 19
TOTAL DW ?
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
MOV CX, 10 ; 数组中有10个值
MOV BX, 0 ; 初始值为0
LEA SI, BUF ; SI指向数组的第一个元素
SUM:
ADD BX, [SI] ; 将当前元素的值添加到总和中
ADD SI, 2 ; 指向下一个元素
LOOP SUM ; 继续处理下一个元素
MOV AX, BX ; 将总和存储在AX寄存器中
MOV [TOTAL], AX ; 将总和存储在TOTAL单元中
MOV AH, 4CH ; DOS退出调用
INT 21H
CODE ENDS
END START
```