|
本帖最后由 奥特曼 于 2010-10-20 14:20 编辑
刚学汇编,哪里写的不好提出来,千万别喷我.呵呵高手可以直接闪过,看不懂的可以加我QQ:79441665,一起学习汇编语言!
下面我把代码贴出来:
line macro n
rept n ;重复次数
mov dl, 13 ;回车
mov ah, 2
int 21h
mov dl, 10 ;换行
mov ah, 2
int 21h
endm
endm
;==========================换行符!
data segment
num1 dw 0 ;定义数字1为字!
msg1 db 'this is CalCu!',13,10,'please input num1 or num2!',13,10,36 ;定义输出一行数字! 36代表字符串'$'!
data ends
;=========================定义数据段!
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
lea dx, msg1
mov ah, 9
int 21h
call inputNum ;第一次调用数字转换CALL
line 1 ;输出一次回车换行!
mov [num1], bx ;把BX的内容保存到[num1]里面!
call inputNum ;第二次调用数字转换CALL
add bx, [num1] ;BX=第二次输入+[num1]里面内容!
call hexNum ;调用转换程序!
mov dl, 'h'
mov ah, 2
int 21h
mov ah, 7
int 21h
mov ah, 76
int 21h
;================数据输入10转16进制子程序==============
inputNum proc near
xor bx, bx ;清除BX=0
newchar:
mov ah, 1 ;一号功能输入带回显
int 21h
sub al, 48 ;AL=AL-48
cmp al, 0 ;AL和0比较
jl exit ;小于0转到exit
cmp al, 9 ;AL和9比较
jg exit ;大于9转到exit
cbw ;字节转换字
xchg ax, bx ;把BX=AX,AX=0
mov cx, 0ah ;CX=0AH--
mul cx ;AX=AX*CX-输入的第2个数为个位,第一个输入的成十位所以乘10
xchg ax, bx ;把BX=AX,AX=BX-
add bx, ax ;BX=BX+AX--这4行代表多位相加
jmp newchar ;跳转到newchar
exit:
Ret ;出栈!,入口参数:AL,出口参数:BX
inputNum endp
;带入一个数字:12
;先输入1,1的ascii是49,减去48=1H,比较是否小于0,不小于的时候看是否大于9.
不大于的话进行字节转换字,AX和BX交换,AX=0H,BX=1H,然后CX=0AH(10进制的10)
AX=AX*CX AX=0 然后进行第2次交换BX=0,AX=1H。然后相加BX=0+1H,BX=0001H,现在是把输入的1进行调整,现在把2进行调整!
再输入2,2的ascii是20,减去48=2H,比较是否小于0,不小于的时候看是否大于9.
不大于的话进行字节转换字,AX和BX交换,AX=1H,BX=2H,然后CX=0AH(10进制的10)
AX=AX*CX AX=0AH 然后进行第2次交换BX=0AH,AX=2H。然后相加BX=0AH+2H,BX=000CH
现在就把12转换成C了,也就是把10进制的12转换成16进制的C。
;================数据转字符显示程序================
hexNum proc near
mov cl, 4 ;CL=4
rot:
ROL bx, CL ;把BX循环左移4次
mov al, bl ;AL=BL的低4位
and al, 0fh ;把AL高位清零
add al, 30h ;AL=AL+30
cmp al, 3ah ;比较AL和3AH 判断AL是否大于键盘ascii码表58
jl viewnum ;小于的话 跳到 viewnum
add al, 7h ;不小于的话 AL=AL+7H
viewnum:
mov dl, al ;显示输出
mov ah, 2
int 21h
dec ch
jnz rot ;不等于0的话继续
Ret
hexNum endp
;接上面,把上面的16进制C转换成ascii码并且输入出去!
置移位次数,CL=4,把BX循环左移4次,刚才BX=000CH,4次后BX=00C0H,然后把BX的低4位给AL
AL=C0H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’判断ZF是否为0不为0继续循环做!
;第2次:把BX循环左移4次,刚才BX=00C0H,4次后BX=0C00H,然后把BX的低4位给AL
AL=00H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’
;第3次:把BX循环左移4次,刚才BX=0C00H,4次后BX=C000H,然后把BX的低4位给AL
AL=00H,然后相与AL=00H。相加AL=30H(10进48,也就是ascii码:‘0’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)显示输出:‘0’
;第4次:把BX循环左移4次,刚才BX=C000H,4次后BX=000CH,然后把BX的低4位给AL
AL=0CH,然后相与AL=0CH。相加AL=3CH(10进60,也就是ascii码:‘<’)!比较是否小于3AH(10进58,也就是ascii码:‘:’57ascii码是:‘9’)不小于,所以加7H AL=43H(10进67,也就是ascii码:‘C’)显示输出:‘C’,最后显示为:000C!
;===============================================
Code ends
end start
把生成的.exe运行图 片也贴出来,呵呵!
因为最后显示是16进制的数字,12+24=0024H(16进制的),下面计算器是把0024H转换成36的!希望不要搞混!
呵呵,看到精易出了个汇编版块才把自己以前写的代码都贴出来了!希望这版块越办越好吧! |
评分
-
查看全部评分
|