|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我是按照王爽老师的书的实验11:
要求:
子程序名称:letterc
功能:将以0结尾的字符串中的小写转换为大写,
参数:ds:si指向字符串的首地址
我写的源码自己加了一个zhan(栈的意思)段设置为栈data是书中的,还有子程序letterc前面的也是书中写的
代码具体如下:
assume cs:code
data segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
zhan segment
dw 5 dup (0)
zhan ends
code segment
start: mov ax,zhan
mov ss,ax
mov sp,10
mov ax,data
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
mov al,61h
cmp al,byte ptr ds:[si] ;小于61无需转换,因为字母a的ASCII的16进制等于61
ja sss ;无需转换的字符则跳转
mov al,7ah
cmp al,byte ptr ds:[si] ;大于7a无需转换,因为字母z的ASCII的16进制等于7a
jb sss ;无需转换的字符则跳转
mov al,ds:[si] ;若未实现跳转则说明需要进行转换
and al,11101111b
mov ds:[si],al
sss: inc si ;指向字符串的寄存器(指针)自增1,指向下一个字节
mov ch,0 ;将下一个字节的值赋值到CX,用于判断是否为0
mov cl,ds:[si]
loop letterc
ret
code ends
end start
问题在于,用debug运行后参数g为什么会出错?
提示:CPU遇到无效指令,而且CS=0了,
还有就是用参数t单步执行,当si等于n了,我查看内存时,n前面的字母还和原来一样未实行转换
是不是上面的cmp指令下面的跳转用错了还是?
|
|