程序如下:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin: mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
push si
push cx
xor cx,cx
n: mov cl,[si]
jcxz over
cmp cl,'a'
jb n1
cmp cl,'z'
ja n1
and [si],byte ptr 0dfh
n1: inc si
jmp n
over: pop cx
pop si
ret
codesg ends
end begin
调试结果如下:
D:\masm>debug shy11.exe
-u0 2a
0B64:0000 B8600B MOV AX,0B60
0B64:0003 8ED8 MOV DS,AX
0B64:0005 BE0000 MOV SI,0000
0B64:0008 E80500 CALL 0010
0B64:000B B8004C MOV AX,4C00
0B64:000E CD21 INT 21
0B64:0010 56 PUSH SI
0B64:0011 51 PUSH CX
0B64:0012 33C9 XOR CX,CX
0B64:0014 8A0C MOV CL,[SI]
0B64:0016 E310 JCXZ 0028
0B64:0018 80F961 CMP CL,61
0B64:001B 7208 JB 0025
0B64:001D 80F97A CMP CL,7A
0B64:0020 7703 JA 0025
0B64:0022 8024DF AND BYTE PTR [SI],DF
0B64:0025 46 INC SI
0B64:0026 EBEC JMP 0014
0B64:0028 59 POP CX
0B64:0029 5E POP SI
0B64:002A C3 RET
-g 5
AX=0B60 BX=0000 CX=006B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0B64 IP=0005 NV UP EI PL NZ NA PO NC
0B64:0005 BE0000 MOV SI,0000
-d ds:0 30
0B60:0000 42 65 67 69 6E 6E 65 72-27 73 20 41 6C 6C 2D 70 Beginner's All-p
0B60:0010 75 72 70 6F 73 65 20 53-79 6D 62 6F 6C 69 63 20 urpose Symbolic
0B60:0020 49 6E 73 74 72 75 63 74-69 6F 6E 20 43 6F 64 65 Instruction Code
0B60:0030 2E .
-g b
AX=0B60 BX=0000 CX=006B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0B64 IP=000B NV UP EI PL NZ NA PO CY
0B64:000B B8004C MOV AX,4C00
-d ds:0 30
0B60:0000 42 45 47 49 4E 4E 45 52-27 53 20 41 4C 4C 2D 50 BEGINNER'S ALL-P
0B60:0010 55 52 50 4F 53 45 20 53-59 4D 42 4F 4C 49 43 20 URPOSE SYMBOLIC
0B60:0020 49 4E 53 54 52 55 43 54-49 4F 4E 20 43 4F 44 45 INSTRUCTION CODE
0B60:0030 2E .
-q
加上显示字符串的子程序,就可以直接在dos下看到结果:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin: mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov dh,5
mov dl,1
mov cx,71h
call show_str
mov ax,4c00h
int 21h
letterc:
push si
push cx
xor cx,cx
n: mov cl,[si]
jcxz over
cmp cl,'a'
jb n1
cmp cl,'z'
ja n1
and [si],byte ptr 0dfh
n1: inc si
jmp n
over: pop cx
pop si
ret
show_str:
push ax
push bx
push cx
push dx
push si
push es
dec dh ;行号减一
mov al,0a0h
mul dh ;0a0h*(行号-1)
mov dh,0
dec dl
add dx,dx ;2*(列号-1)
add ax,dx ;0a0h*(行号-1)+2*(列号-1)
mov bx,ax
mov ch,0 ;ch清零,为cx进栈(颜色)做准备
mov ax,0b800h
mov es,ax ;显存段地址
s1: push cx ;颜色进栈
mov cl,[si] ;取出一个字符
jcxz ok ;是零则返回
mov es:[bx],cl ;不是零,放显存相应单元
inc bx
pop cx ;取回颜色
mov es:[bx],cl;存颜色
inc bx
inc si
jmp short s1 ;修改指针并循环
ok: pop cx ;返回前,将刚才进栈的cx出栈,使栈顶指针指向返回地址
pop es
pop si
pop dx
pop cx
pop bx
pop ax
ret
codesg ends
end begin
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50