做了道汇编题 目的是将字符串用16进制输出 帮忙改改 谢谢了

kwxiang 2008-10-24 07:42:35
.model small
.data
X db 'aaaaaaaaaaaaaaaa',0,'$';
Y db 000000000000000000,'$'
.stack 200
db 100 dup(0)
.code
lea si,x
lea di,y
a:
lodsb
cmp al,'$'
jz ok
mov ah,al
xor ah,0fh
shr ah,4
cmp ah,10
jz hex
add ah,30h
hex:
add ah,31h
xor al,0fh
cmp al,10
jz hex1
add ah,30h
hex1:
add ah,31h
stosb
jmp a
ok:
lea dx,h
MOV AH,9
INT 21
end
...全文
119 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-10-24
  • 打赏
  • 举报
回复
使用386指令集需要写.386。
每个字节用16进制表示是2位,所以Y的长度至少要等于X的两倍。
程序开头需要初始化ds:
mov ax, data
mov ds, ax
lodsb之前要cld。
xor ah, 0fh是把ah的低4位取反,高4位不变。如果要取低4位,应该用and ah, 0fh,取高4位用shr ah,4。
大于等于10时,应该减去10再加上'A'。
stosb之前要初始化es:
push ds
pop es
lea dx,h,没看到h在哪定义。
int 21后面要加H,否则是10进制21,不是DOS中断。
程序最后要:
mov ax, 4c00h
int 21h
bysdy 2008-10-24
  • 打赏
  • 举报
回复
看不太懂楼主意思,是把输入的字符串,转化成相应的数字吗?
比如A=10,B=11,C=12??
重新写了一个
楼主看看是不是这个意思啊?

.model small
.data
X db 'abcdefABCDEF123',0,'$';
Y db 100 dup (0)
db '$'

.code
mov ax,@data
mov ds,ax
mov es,ax ;关联段
mov ax,0
lea si,x
lea di,y

a:
lodsb
cmp al,'$'
jz ok
mov ah,al
cmp ah,'0' ;若是0-9则直接输出到Y
jb error
cmp ah,'9'
ja next
jmp s
next:
or ah,00100000b ;把大写转化成小写字母
cmp ah,'a'
jb error
cmp ah,'f' ;若值在'a'和'f'之间,则继续,否则忽略
ja error

mov al,31h
stosb ;因为abcdef必定>10,所以十位为1

sub ah,'a'
add ah,30h ;ah-'a'并转化成相应的数字
mov al,ah
jmp s
s:

stosb
jmp a

error:
jmp a

ok:
lea dx,y
MOV AH,9
INT 21h ;输出结果

MOV AH,4CH
INT 21H
end
xiaopoy 2008-10-24
  • 打赏
  • 举报
回复
xor al,0fh
shr al,4
直接shr ah,4即可以,低4位会被丢弃的

若是写回的时候需要
stosw吧

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧