8086组装-更好的数据存储/操作?

米利兹贝斯

我正在为一个课堂项目工作,并且按项目要求工作,尽管我想知道是否有一种更好的方法来实现一些事情。我因在另一个项目中不必要的“移动”而停靠了几点。这是问题1。

“如果-否则(34分):编写一个程序,要求用户输入一个数字。如果该数字小于5,则应声明,然后将其加5并将其存储在变量中;如果该数字大于5,则将其声明为0,然后从中减去5并将其存储在变量中;如果数字为5,则将其加3并声明为3并将其存储在变量中。”

org 100h   
mov dx, offset start   ;move start of string address 'start' into dx
mov ah, 09h   
int 21h                ;print the string stored at DS:DX
mov ah, 01h            ;function for getting keyboard input
int 21h
sub al, 30h            ;subtract 30h to store our number as hexadecimal
mov bl, al             ;copying data to BL as the following commands manipulate the data
                       ;at AL. 
cmp bl, 5              ;BL = AL
jz ifZero              ;jump to ifZero if BL = 5
jl ifLess              ;jump to isLess if BL < 5
jg ifGreater           ;jump to ifGreater if BL > 5

ifZero:                ;direct console output function
mov ah, 06h            
mov dl, 0Ah
int 21h
mov dl, 0Dh
int 21h                ;print newline and character return
add bl, 03h            ;add 3 to BL, BL = 8
mov temp, bl           
mov dx, offset eq      ;move start of string address 'eq' into dx
mov ah, 09h
int 21h                ;print string
jmp exit               ;unconditional jump to end program

ifLess:                ;direct console output function
mov ah, 06h
mov dl, 0aH
int 21h
mov dl, 0Dh
int 21h                ;print newline and character return
add bl, 05h            ;add 5 to BL
mov temp, bl           
mov dx, offset less    ;move start of string address 'less' into dx
mov ah, 09h
int 21h                ;print string
jmp exit               ;unconditional jump to end program

ifGreater: 
mov ah, 06h            
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h                ;print newline and character return
sub bl, 05h            ;subtract 5 from BL
mov temp, bl
mov dx, offset great   ;move starting address of string 'great' into dx
mov ah, 09h
int 21h                ;print string
jmp exit               ;unconditional jump to end program


exit:
ret

temp db ? 
start db "Please enter a number: $"
less db "Less than 5... adding 5 $"
great db "Greater than 5... subtracting 5 $"
eq db "Equal to 5... adding 3 $"

在这种情况下,是否不需要'mov bl,al'?通过反汇编程序运行,表明AL中的数据在执行这些命令中的大多数后都会发生变化。这应该发生吗?有更好的方法吗?

问题3:计数器控制的循环。该程序将要求用户输入一个字符,然后将其显示带有标签的字符五次。例如:输入一个字符:A您输入了:A

org 100h
mov cx, 05h             ;counter controlled loop, start as 5

LabelLoop:
mov dx, offset prompt   ;move string offset to dx
mov ah, 09h             ;function for printing string from dx
int 21h
mov ah, 01h             ;function to read character from keyboard
int 21h    
mov bl, al              ;preserving character read by copying to BL
                        ;as register data for AL will be changing
                        ;due to various functions
mov ah, 06h             ;function for direct console output
mov dl, 0ah
int 21h
mov dl, 0dh             ;these just make the text appear on a new
                    ;line
int 21h
mov dx, offset output   ;move the memory offset of output to dx
mov ah, 09h             ;printing another string
int 21h
mov ah, 02h             ;function to write a character to console
                        ;gets the value from DL
mov dl, bl                  ;so we copy BL to DL and print it
int 21h
jmp newLine             ;we unconditionally jump to the newLine
                        ;label and print a new line for the program
                        ;to run again

newLine:
mov ah, 06h
mov dl, 0ah
int 21h
mov dl, 0dh
int 21h
loop LabelLoop         ;we jump to LabelLoop and CX = CX - 1

mov dx, offset goodbye
mov ah, 09h
int 21h

ret

prompt db 'Enter a character: $'
output db 'You entered: $'
goodbye db 'Good bye!$'

因此,对于这些问题,我有更好的方法吗?键盘输入存储在AL中,但是每次我对AH执行mov功能时,无论是字符串打印还是字符打印,寄存器值都会更改。为了避免变量(因为它不是要求的一部分)或将其分配到内存(我们还没有学到),我将数据移到了另一个寄存器中。这对于两个程序来说都是不必要的“移动”吗?

编辑:我意识到后AL = DL

mov ah, 06h
mov dl, 0ah
int 21h       ;AL = DL after execution
九月罗兰
cmp bl, 5              ;BL = AL
jz ifZero              ;jump to ifZero if BL = 5
jl ifLess              ;jump to isLess if BL < 5
jg ifGreater           ;jump to ifGreater if BL > 5
ifZero:

您应该做的第一个改进是利用代码中的漏洞。不要使用jz ifZero而告吹的平等是唯一的状态遗体后jljg同样,ifEqual将是此状态的更正确名称。

cmp bl, 5              ;BL = AL
jl ifLess              ;jump to isLess if BL < 5
jg ifGreater           ;jump to ifGreater if BL > 5
ifEqual:

第二个优化是摆脱CR和LF的所有直接控制台输出。您应该将这些内容合并到将要打印的消息中。这样做还将消除使用mov bl, al(您特别要求过)将AL复制到BL的需要

less  db 13,10,"Less than 5... adding 5 $"
great db 13,10,"Greater than 5... subtracting 5 $"
eq    db 13,10,"Equal to 5... adding 3 $"

这是另一个机会:

jmp exit               ;unconditional jump to end program
exit:

您的第二个程序也可以从这些建议中受益。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章