在汇编语言中使用跳转和比较
Posted
技术标签:
【中文标题】在汇编语言中使用跳转和比较【英文标题】:Using Jump and Compare in Assembly Language [duplicate] 【发布时间】:2013-04-01 17:32:38 【问题描述】:我在下面有这个计算器代码,它工作正常,但它不会跳到“除法”..我仍在学习汇编编程的过程中..需要帮助来解决这个问题...
.model 小 .stack 100h 。数据 msg1 db 13,10,13,10,“输入第一个数字:$” msg2 db 13,10,“输入第二个数字:$” msgEr db 13,10,“错误 $” msgCh db 13,10,“按 A 加,S 减,D 乘,F 减,X 退出:$” msgSum db 13,10,13,10, "总和是 : $" msgDif db 13,10,13,10,“区别是:$” msgDiv db 13,10,13,10,“商是:$” msgMul db 13,10,13,10, "产品是 : $" tmp 数据库? 。代码 开始: 移动斧头,@data mov ds, ax 铅 dx, msg1 mov 啊, 09h 整数 21 小时 移动 bx, 0 开始1: mov 啊, 01h 整数 21 小时 cmp al,0dh 下一个1 mov 啊,0 亚铝,30h 推斧 移动斧头,10d mul bx 流行音乐 添加 bx,ax 跳转开始1 下一个: 推bx 铅 dx,msg2 mov ah,09h 整数 21 小时 移动 bx,0 开始2: mov 啊,01h 整数 21 小时 cmp al,0dh 我的选择 mov 啊,0 亚铝,30h 推斧 移动斧头,10d mul bx 流行音乐 添加 bx,ax 跳转开始2 选择: 领导 dx, msgCh mov 啊, 09h 整数 21 小时 mov 啊, 01h mov 答案,人 整数 21 小时 cmp al,'f' je分割 cmp al,'a' je添加 cmp al,'s' je 减法 cmp al,'d' je 倍增 cmp al,'x' mov ah, 4ch 整数 21 小时 错误: 领导 dx,msgEr mov ah,09h 整数 21 小时 跳转开始 划分: 流行斧 div bx 推斧 领导 dx,msgDiv mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 添加: 流行斧 添加斧头,bx 推斧 领导 dx,msgSum mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 乘法: 流行斧 mul bx 推斧 领导 dx,msgMul mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 跳转 减去: 流行斧 子斧头,bx 推斧 引导 dx,msgDif mov ah,09h 整数 21 小时 流行斧 mov cx,0 移动 dx,0 mov bx,10d 休息: div bx 推dx 移动 dx,0 公司 或斧头,斧头 休息 答: 流行音乐 添加 dl,30h mov 啊,02h 整数 21 小时 循环回答 跳转开始 结束开始【问题讨论】:
请详细说明。当您到达cmp al, 'f'
语句时,您是否真的在al
中有一个小写的“f”,然后跳转没有发生,或者它怎么不会跳转?
另外... mov dx, 0
在div
之前!
哦..我只是按照你说的添加'mov dx,0'并且它有效..如果可以的话你能解释一下这部分吗?谢谢
@SachiTekina: div bx
将dx:ax
中的32 位值除以bx
并将商存储在ax
中。如果商太大而无法放入ax
- 如果dx
包含一些“随机”值可能会发生 - 你最终会出现除法溢出。这就是为什么你应该在除法之前清除dx
。
【参考方案1】:
您必须在执行操作之前清除 DX。 x86 中的除法将在DX:AX
上运行。如果你没有先清除它并且它有一些内容,你最终可能会出现溢出情况。显然,这很糟糕。 :)
所以:
dividing:
pop ax
div bx
应该变成:
dividing:
pop ax
mov dx,0
div bx
【讨论】:
【参考方案2】:.model small
.stack 100h
.data
msg1 db 13,10,13,10, "Enter 1st Number : $"
msg2 db 13,10, "Enter 2nd Number : $"
msg01 db 13,10,13,10, "Enter base Number : $"
msg02 db 13,10, "Enter power Number : $"
msgEr db 13,10, "Error $"
msgCh db 13,10, "Press A to ADD , S to SUBTRACT ,M to MULTIPLY, D to DIVIDE,F to FIND FACTORIAL,P to FIND X POWER Y, X to EXIT : $ "
msgSum db 13,10,13,10, "Sum is : $"
msgDif db 13,10,13,10, "Difference is : $"
msgDiv db 13,10,13,10, "Quotient is : $"
msgMul db 13,10,13,10, "Product is : $"
msgPOW db 13,10,13,10, "ANS is : $"
tmp db ?
.code
start:
mov ax, @data
mov ds, ax
lea dx, msgCh
mov ah, 09h
int 21h
mov ah, 1
mov dl, al
int 21h
cmp al,'d'
je dividing
cmp al,'a'
je adding
cmp al,'s'
je subtracting
cmp al,'m'
je multiplying
cmp al,'f'
je fact
cmp al,'p'
je x_pow_y
cmp al,'x'
mov ah, 4ch
int 21h
error:
lea dx,msgEr
mov ah,09h
int 21h
jmp start
;//////////////////////////////////////
dividing:
lea dx, msg1
mov ah, 9
int 21h
start1:
mov ah, 1
int 21h
cmp al,0dh
je next1
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start1
next1:
push bx
lea dx,msg2
mov ah,09h
int 21h
mov bx,0
start2:
mov ah,1
int 21h
cmp al,0dh
je d
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start2
d:
pop ax
mov dx,0
div bx
push ax
lea dx,msgDiv
mov ah,09h
int 21h
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break
;///////////////////////////////////
adding:
lea dx, msg1
mov ah, 9
int 21h
mov bx, 0
start01:
mov ah, 1
int 21h
cmp al,0dh
je next01
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start01
next01:
push bx
lea dx,msg2
mov ah,09h
int 21h
mov bx,0
start02:
mov ah,1
int 21h
cmp al,0dh
je a
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start02
a:
pop ax
add ax,bx
push ax
lea dx,msgSum
mov ah,09h
int 21h
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break
;///////////////////////////////
multiplying:
lea dx, msg1
mov ah, 9
int 21h
mov bx, 0
start001:
mov ah, 1
int 21h
cmp al,0dh
je next001
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start001
next001:
push bx
lea dx,msg2
mov ah,09h
int 21h
mov bx,0
start002:
mov ah,1
int 21h
cmp al,0dh
je m
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start002
m:
pop ax
mov dx,0
mul bx
push ax
lea dx,msgMul
mov ah,09h
int 21h
pop ax
mov cx,0
mov dx,0
mov bx,10d
jmp break
;//////////////////////////////////
fact:
lea dx, msg1
mov ah, 9
int 21h
mov bx, 0
start003:
mov ah, 1
int 21h
cmp al,0dh
je l
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start003
l: ;ax=6
mov cx,bx
mov ax,1
jmp l2
l2:
cmp cx,0
je l1
mov dx,0
mul cx
push ax
lea dx,msgPOW
mov ah,09h
int 21h
sub cx,1
pop ax
jmp l2
l1:
mov dx,0
mov bx,10d
jmp break
;//////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\
x_pow_y:
lea dx, msg01
mov ah, 9
int 21h
mov bx, 0
start004:
mov ah, 1
int 21h
cmp al,0dh
je next004
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start004
next004:
push bx
lea dx,msg02
mov ah,09h
int 21h
mov bx,0
start005:
mov ah,1
int 21h
cmp al,0dh
je p
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start005
p:
mov cx,bx
pop ax
mov bx,ax
mov dx,0
c:
cmp cx,1
je c1
mul bx
push ax
lea dx,msgPOW
mov ah,09h
int 21h
sub cx,1
pop ax
jmp c
c1:
mov cx,0
mov dx,0
mov bx,10d
jmp break
;/////////////////////////////// \\\\\\\\\\\\\\\\\\\\\ ' _ '
subtracting:
lea dx, msg1
mov ah, 9
int 21h
mov bx, 0
start0001:
mov ah, 1
int 21h
cmp al,0dh
je next0001
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start0001
next0001:
push bx
lea dx,msg2
mov ah,09h
int 21h
mov bx,0
start0002:
mov ah,1
int 21h
cmp al,0dh
je s
mov ah,0
sub al,30h
push ax
mov ax,10d
mul bx
pop bx
add bx,ax
jmp start0002
s:
pop ax
sub ax,bx
push ax
lea dx,msgDif
mov ah,09h
int 21h
pop ax
mov cx,0
mov dx,0
mov bx,10d
break:
div bx
push dx
mov dx,0
inc cx
or ax,ax
jne break
ans:
pop dx
add dl,30h
mov ah,02h
int 21h
loop ans
jmp start
end start
【讨论】:
使用编辑器功能将代码标记为代码,将文本标记为文本。这使您的帖子更具可读性。 :) 如果你不说(在代码之外的文本中)出了什么问题,你做了什么改变,这个答案基本上是没用的。以上是关于在汇编语言中使用跳转和比较的主要内容,如果未能解决你的问题,请参考以下文章