我是靠谱客的博主 温暖火龙果,最近开发中收集的这篇文章主要介绍丁辉汇编-7-分支程序设计-习题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 1 

mov al, 60h
cmp al, 0bbh
jb l2

l1:
mov al, 0bbh
l2:
NOP
分析:
1 jb因此是无符号数
2 60<bb 因此,成立
3 al最后为60h
mov al, 60h
cmp al, 0bbh
JL l2

l1:
mov al, 0bbh
l2:
NOP
有符号数
60正数大于负数bbh,因此不满足条件
al结果为bbh
xor al, al
mov bl, 98h
add bl, 88h
jnc L2

L1:
INC AL;
L2: NOP
jnc判断有没有进位,无进位跳转,
这里有进位,因此不转。al=01
xor al, al
mov bl, 98h
add bl, 88h
jnc L2

L1: 
INC AL;
L2: NOP
判断有没有溢出,明显有。
故同样不转。
mov al,1
mov bl, 72h
add bl, 40h
jc L2

L1: xor al, al
L2: nop
判断进位,没有,不转,=0
mov al,1
mov bl, 72h
add bl, 40h
jo L2

L1: xor al, al
L2: nop
72+40H 有溢出?这个时候,要把两个数
当做有符号数来看待。一个字节的最大有符号值时127,因此溢出了。结果=0
mov bl, 46h
test bl, 01h
jz l2
test 是看看最低位是否为0,这里6=0110并不是1,因此jz不跳转。al被L1清空=0
mov bl, 46h
test bl, 0FFh
jNP l2
test是与and一致的操作,只是同cmp一样不影响目的操作数,只影响标志寄存器FLAGS。
JP和JNP是判断1的个数是否是偶数。这里怎么判断呢?其实就是看多少个1,这里46=01000110,3个1,奇数,因此JNP转,就会让al=1了


2
 mov al,x
cmp al,0
jz zero
jl nega
mov al,1
jmp ok

zero:
xor al, al
jmp ok

NEGA: MOV al, 0ffh

3 找三者得最大值:1240h(有符号数,9cc0h为负数)

4 把三个连续存放的单字节无符号数按递增次序重新存放在原存储位置

分析:
1 定义三个连续存放的单字节db数
2 从第一个开始与第二个比较,如果大于就交换位置,再与第三个比较,如果大于则交换位置。
3 第二个与第三个比较,如果大于,则交换位置。
我写的,估计是太复杂了,看看别人写的: 
name example_7.3.1
dseg segment

tt db 43,8,50

dseg ends

sseg segment stack
db 80h dup(0)
sseg ends

cseg segment
     assume cs:cseg, ds:dseg, ss:sseg
start:
mov ax, dseg
mov ds, ax
xor ax, ax

;.................
mov al, tt
cmp al, tt+1
ja chg1

chg2:
mov al, tt+1
cmp al, tt+2
ja chg3
jmp ok

chg1:
mov bl, al
mov al, tt+1
mov tt,al
mov tt+1,bl
jmp chg2

chg3:
mov bl,al
mov al, tt+2
mov tt+1, al
mov tt+2, bl
;.................




ok:
mov ah, 4ch
int 21h

cseg ends
end start
mov al,buf
mov bl,buf+1
mov cl,buf+2

cmp al,bl
JAE L1
XCHG al,bl

L1:
cmp al,cl
JAE L2
xchg al,cl

L2:
cmp bl,cl
JAE L3
XCHG bl,cl

L3:
mov buf+2,al
mov buf+1, bl
mov buf, cl

;display the result:
lea dx, buf
mov ah,9
int 21h

与我的区别:

  • 只在开始导入和导出使用了存储器
  • 使用了XCHG,简化了代码
  • 使用了满足条件调整,而我的是不满足调整,考虑问题角度不同

5 单字节x,y,求x^2和Y^2,并将较大者送Z。
分析:
分别计算两者平方,然后存放到16位寄存器,然后比较大小。
我写的推荐答案
x db 0a2h
y db 3ah
z dw ?

mov al,x
SAL ax,1
mov bx,ax

mov al,y
SAL ax,1

cmp ax,bx
JBE YisBig
mov z,ax
jmp ok;

YisBig:
mov z,bx
mov al,x
IMUL al
mov bx,ax

mov al,y
IMUL al

cmp ax,bx
JBE YisBig
mov z,ax
jmp ok;

YisBig:
mov z,bx
非常严重的错误:
  • 把平方当做了乘以2,而采用左移,真是悲催!
 


6 求5字节无符号数D1和D2之和,要求考虑进位问题,结果送6字节变量D3.试编写程序!
分析:
  • 5字节无符号数怎么表示:需要三字变量定义DF
  • 如何考虑进位问题:如何将这个DF放入寄存器是个问题,放在edx:eax是可以的,就要用80386以上编程,但是怎么放还是问题,数据应该从数据区导入,应为add不允许两个内存数据直接相加。
  • EAX放低四位,EDX放高2两位。
  • 这个还真是不知道怎么表达:
meRecommended
写不出来D1 DB 91h, 12h, 13h, 14h, 15h ;the data should be 1514131291h (lower bit at first)
D2 DB 37h, 18h, 19h, 20h, 21h
D3 DB 6 DUP(0)

mov al,D1
add al,d2
mov d3,al

mov al, d1+1
adc al,d2+1
mov d3+1,al

mov al, d1+2
adc al,d2+2
mov d3+2,al

mov al, d1+3
adc al,d2+3
mov d3+3,al6

mov al, d1+4
adc al,d2+4
mov d3+4,al
;单独处理进位
mov al,0
adc al,0
mov d3+5, al
 
  • 如何处理多字节:分成多个单字节
  • 注意字节顺序:低字节在前,高字节在后,因此要注意数据标识时的顺序
  • 定义一个未知数的时候可以定义为?,也可以定义为DUP(0)
  • 最后一个进位怎么处理?0+0+CF

7 将双字节有符号数D1,D2之差送变量D3,要求考虑溢出问题,结果用4字节表示,试编出程序。
分析:
  • 双字节可以直接用DW,也可以用两个DB
  • 考虑溢出问题?
meRecommended
mov al, d1
mov bl, d2
sub al,bl
mov d3, al

mov al,d1+1
mov bl,d2+1
sbb al,bl
mov d3+1,al

mov al,0
sbb al,0
mov d3+2,al            
D1 dw -1291h
d2 dw 0437h
d3 dw 2 dup(0)

mov ax,d1
sub ax,d2
jo done
mov d3,ax
test ax, 8000h
jz done

NOT d3+2
Done:
错的不可理喻,完全没有把握问题要点
  • 上一题的最后的进位可以直接影响值的改变,此题可以直接通过溢出符号标志位来判断
  • jz成功是在ax的最高位为0时,而不是相减为0时。因此这里的意思是,如果ax最高位为1,则不跳转,并将d3+2的dw全部转化为1.(NOT是求非命令
  • 要判断两次:1 是否溢出,如果是,直接结束;2 是否是负数,那么改变高位为负数标志。

8 根据键盘输入的字符'a'~'c' ,分别显示'1 st', '2nd', '3rd',当输入的是其他字符,则需要重新输入。
分析:
  • 用al接受键盘输入
  • 判断输入字符是否满足a的要求,如果是,则显示对应字符(使用跳转表吧,show一下)
  • 如果不是,判断是否是b,类似,然后判断是否是c,还不是的话,就重新接受键盘输入,如果给予提示就更好了。
merecommended
name example_7.8
dseg segment

MS db 'please input again:','$';
MESS0 Db '1st','$'
MESS1 Db '2st', '$'
MESS2 Db '3st', '$'

dseg ends

sseg segment stack
db 80h dup(0)
sseg ends

cseg segment 
     assume cs:cseg, ds:dseg, ss:sseg
start: 
mov ax, dseg
mov ds, ax
xor ax, ax
;.................
mov ah,07h
int 21h

JUDGE:
cmp al, 'a'
jz SHOWA
cmp al, 'b'
jz SHOWB
cmp al, 'c'
jz SHOWC
JMP SHOWHINT


SHOWA:
mov dx, offset mess0
JMP DISP

SHOWB:
mov dx, offset mess1
JMP DISP

SHOWC:
mov dx, offset mess2
JMP DISP

SHOWHINT:
mov dx, offset ms
mov ah,09h
int 21h
mov ah, 07h
int 21h
jmp JUDGE 

DISP:
mov ah,09h
int 21h
;.................

ok: 
mov ah, 4ch
int 21h

cseg ends
end start
几点区别:
  • mov dx, offset MESS0可以用LEA dx,MESS0替代
  • jz可以用je来替代,两者是等价的。
  • 直接把JUDGE放在mov ah,07h之前,然后后面就可以在跳转时省略再次写这句。
至少结果应该是可运行的,看看推荐答案有什么特点: 
































最后

以上就是温暖火龙果为你收集整理的丁辉汇编-7-分支程序设计-习题的全部内容,希望文章能够帮你解决丁辉汇编-7-分支程序设计-习题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部