|
发表于 2013-2-6 12:58:46
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-6 13:00 编辑
你的逻辑好像是错的。。
先分析你为什么是错的,再给你正确的代码
我想你是想这样的,首先让ax等于要显示的那个值
然后你先取低位e,然后通过偏移在数据段中兑换成相应的ascii吗
然后取高位1,继续这样
很有想法,很不错,但忽略3点
mov ax,1eh
ax是等于001eh而不是等于010eh
第二点比较粗心了,你DATA段mother fuck多写了一个D变成0123456789ABCDDEF
还有,寄存器寻址用法你好像乱了
所以fail
那么我们只要想办法让ah=1,al=e,再把你寄存器错误寻址方法改改就行了,是吧
按照你的思路来好了(另一种转换法是+30H就可以转换成ascii码)
- assume cs:code
- data segment
- db '0123456789ABCDEF'
- data ends
- code segment
- start:
- mov ax,data
- mov ds,ax
- mov ax,1eh
- call show
- mov ax,4c00h
- int 21h
- show:
- push bx
- push cx
- mov cl ,4
- shl ax,cl ;左移4位,AX=01e0h相当于乘以2^4=16,也就是乘以10H(相当于全部向高移一位),这样让
- ;ah=1,al=e0h
- ;至此,高位搞定,接下来是低位
- ;al=e0h,想办法让al=0eh,同样用那种方法,这次用右移指令,不过只右移al
- ;cl已经等于4了,所以cl不用重新赋值
- shr al,cl
- ;OK,至此ax=010eh,目的达成
- mov bl,al
- mov bh,0
- mov al,ds:[bx]
- mov bl,ah
- mov bh,0
- mov ah,ds:[bx]
- mov si,0b800h
- mov es,si
- mov es:[160*12+80],ah
- mov es:[160*12+82],al
- pop cx
- pop bx
- ret
- code ends
- end start
复制代码
首先是测试AX=1E的
然后测试AX=25H的
都通过了。
|
|