汇编保存和比较字符
Assembly save and compare characters
我是 Assembly 的新手,我正在尝试执行以下操作:
伪代码:
loop:
input
if(input == $)
end loop
else if(input < savedInput)
savedInput = input
;
print savedInput
基本上它是一个恒定的循环,检测用户输入并将保存的输入的 ASCII 值与新输入进行比较,如果新输入较低,则它会替换保存的输入。如果输入等于 $ 则结束循环并打印保存的输入。
这是我的代码
.MODEL SMALL
.STACK 100h
.DATA
insertMsg DB 13, 10, 'Introduce un dato: ', 13, 10, '$'
.CODE
main:
mov ax,@data
mov ds,ax ; Set DS to point to the data segment
mov dx,OFFSET insertMsg ; Point to the insertMsg
back:
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
mov ah,1 ; DOS: get character: Service 21h, 01h
int 21h ; Get a single-character response
cmp al,'$' ; if character equals $
je display ; goto display
loop back ; loop back
display:
mov ah,9 ;DOS: print string: Service 21h, 09h
int 21h ;display input
mov ah,4Ch ;DOS: terminate program: Service 21h, 4Ch
mov al,0 ;return code will be 0
int 21h ;terminate the program
end main
问题是我不知道如何保存和比较ASCII值
我添加了一些代码说明来解决您的问题;我已经成功地测试了它们。还有一个显示 ASCII 代码的新例程。请注意,某些 ASM 编译器使用 DISPLAY 作为保留字(我已在 dispOut 中将其重命名):
.MODEL SMALL
.STACK 100h
.DATA
insertMsg DB 13, 10, 'Introduce un dato: ', 13, 10, '$'
outputMsg DB 13, 10, 'Dato minore tra quelli inseriti: ', 13, 10, '$'
ASCIIstr DB 13, 10, 'ASCII= ', 0, 0, 0, 13, 10, '$'
.CODE
main:
mov ax,@data ; ... Set DS
mov ds,ax ; ... to point to the data segment
mov dx,OFFSET insertMsg; Point to the insertMsg
mov bx,OFFSET ASCIIstr ; Point to the ASCIIstr
mov cl,255 ; Set SAVED-INPUT to max-ASCII
back:
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
mov ah,1 ; DOS: get character: Service 21h, 01h
int 21h ; Get a single-character response
cmp al,'$' ; If character equals $ ...
je dispOut ; ... goto dispOut
cmp al,cl ; If char. read >= SAVED-INPUT ...
jae cont ; ... skip next instruction, else ...
mov cl,al ; ... save char. read (it is < SAVED-INPUT)
cont:
call dispCode ; Display ASCII code
jmp back ; Loop back
dispOut:
mov dx,OFFSET outputMsg; Point to the outputMsg
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display outputMsg
mov dl,cl ; Load SAVED-INPUT into DL's reg.
mov ah,2 ; DOS: display output: Service 21h, 02h
int 21h ; Write a single-character
call dispCode ; Display ASCII code
mov ah,4Ch ; DOS: terminate program: Service 21h, 4Ch
mov al,0 ; Return code will be 0
int 21h ; Terminate the program
dispCode: ; Display an ASCII code
; AL: ASCII code
; BX: OFFSET ASCIIstr
mov ch,10 ; Load 10 into CH's reg.
xor ah,ah ; AX contains the ASCII code
div ch ; AH contains the last significant digit
add ah,'0' ; Converts AH into ASCII digit
mov ds:[bx+11],ah ; Store the last significant digit in ASCIIstr
xor ah,ah ; AX contains the ASCII code / 10
div ch ; AH: penult. sign. digit; AL: 1st sign. digit
add ah,'0' ; Converts AH into ASCII digit
mov ds:[bx+10],ah ; Store the penult. sign. digit in ASCIIstr
add al,'0' ; Converts AL into ASCII digit
mov ds:[bx+9],al ; Store the 1st sign. digit in ASCIIstr
xchg dx,bx ; Swap msg offset
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
xchg dx,bx ; Swap msg offset
ret ; Return
end main
我是 Assembly 的新手,我正在尝试执行以下操作:
伪代码:
loop:
input
if(input == $)
end loop
else if(input < savedInput)
savedInput = input
;
print savedInput
基本上它是一个恒定的循环,检测用户输入并将保存的输入的 ASCII 值与新输入进行比较,如果新输入较低,则它会替换保存的输入。如果输入等于 $ 则结束循环并打印保存的输入。
这是我的代码
.MODEL SMALL
.STACK 100h
.DATA
insertMsg DB 13, 10, 'Introduce un dato: ', 13, 10, '$'
.CODE
main:
mov ax,@data
mov ds,ax ; Set DS to point to the data segment
mov dx,OFFSET insertMsg ; Point to the insertMsg
back:
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
mov ah,1 ; DOS: get character: Service 21h, 01h
int 21h ; Get a single-character response
cmp al,'$' ; if character equals $
je display ; goto display
loop back ; loop back
display:
mov ah,9 ;DOS: print string: Service 21h, 09h
int 21h ;display input
mov ah,4Ch ;DOS: terminate program: Service 21h, 4Ch
mov al,0 ;return code will be 0
int 21h ;terminate the program
end main
问题是我不知道如何保存和比较ASCII值
我添加了一些代码说明来解决您的问题;我已经成功地测试了它们。还有一个显示 ASCII 代码的新例程。请注意,某些 ASM 编译器使用 DISPLAY 作为保留字(我已在 dispOut 中将其重命名):
.MODEL SMALL
.STACK 100h
.DATA
insertMsg DB 13, 10, 'Introduce un dato: ', 13, 10, '$'
outputMsg DB 13, 10, 'Dato minore tra quelli inseriti: ', 13, 10, '$'
ASCIIstr DB 13, 10, 'ASCII= ', 0, 0, 0, 13, 10, '$'
.CODE
main:
mov ax,@data ; ... Set DS
mov ds,ax ; ... to point to the data segment
mov dx,OFFSET insertMsg; Point to the insertMsg
mov bx,OFFSET ASCIIstr ; Point to the ASCIIstr
mov cl,255 ; Set SAVED-INPUT to max-ASCII
back:
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
mov ah,1 ; DOS: get character: Service 21h, 01h
int 21h ; Get a single-character response
cmp al,'$' ; If character equals $ ...
je dispOut ; ... goto dispOut
cmp al,cl ; If char. read >= SAVED-INPUT ...
jae cont ; ... skip next instruction, else ...
mov cl,al ; ... save char. read (it is < SAVED-INPUT)
cont:
call dispCode ; Display ASCII code
jmp back ; Loop back
dispOut:
mov dx,OFFSET outputMsg; Point to the outputMsg
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display outputMsg
mov dl,cl ; Load SAVED-INPUT into DL's reg.
mov ah,2 ; DOS: display output: Service 21h, 02h
int 21h ; Write a single-character
call dispCode ; Display ASCII code
mov ah,4Ch ; DOS: terminate program: Service 21h, 4Ch
mov al,0 ; Return code will be 0
int 21h ; Terminate the program
dispCode: ; Display an ASCII code
; AL: ASCII code
; BX: OFFSET ASCIIstr
mov ch,10 ; Load 10 into CH's reg.
xor ah,ah ; AX contains the ASCII code
div ch ; AH contains the last significant digit
add ah,'0' ; Converts AH into ASCII digit
mov ds:[bx+11],ah ; Store the last significant digit in ASCIIstr
xor ah,ah ; AX contains the ASCII code / 10
div ch ; AH: penult. sign. digit; AL: 1st sign. digit
add ah,'0' ; Converts AH into ASCII digit
mov ds:[bx+10],ah ; Store the penult. sign. digit in ASCIIstr
add al,'0' ; Converts AL into ASCII digit
mov ds:[bx+9],al ; Store the 1st sign. digit in ASCIIstr
xchg dx,bx ; Swap msg offset
mov ah,9 ; DOS: print string: Service 21h, 09h
int 21h ; Display inputMsg
xchg dx,bx ; Swap msg offset
ret ; Return
end main