assembly 如何比较两个字符串,并在程序集8086中更改它们的颜色

kmynzznz  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(121)

有人能帮帮我吗,我知道要组装,我必须做以下事情:
编写一个汇编语言程序,使您可以从键盘输入两行不超过50个字符的字符。和以适当的颜色显示以下字符组:两个术语的共同字符(红色)、第一行中不在第二行中的字符(蓝色)、第二行中不在第一行中的字符(黄色)
我已经做了第一部分,但我不知道如何改变文字的颜色

.model small

.data
message1 db "Enter any string: $"
message2 db "Given string is :$"
str1 db 50 dup('$')
str2 db 25 dup('$')

.code

mov ax,@data
mov ds,ax   
;--------------------------------------------------
; disply first massege:
mov dx,offset message1    ; Enter any string: 
mov ah,09h
int 21h    
;adding new line
;--------------------------------------------------
call new_line
;--------------------------------------------------
;fist strig up to 25 char
firstString:
lea dx, str1
mov str1,26
mov ah,10
int 21h

;adding new line
;--------------------------------------------------
call new_line 
;--------------------------------------------------   
;second string up to 25 char
lea dx, str2
mov str2,26
mov ah,10
int 21h

;adding new line
;--------------------------------------------------
call new_line
        
;disply the input
;-------------------------------------------------- 
mov dx,offset message2
mov ah,09h
int 21h 

;adding new line
;--------------------------------------------------
call new_line
;first string
;------------
mov cl,str1[1]
mov si,2
Output:
mov dl,str1[si]
mov ah,2
int 21h
inc si
loop output        
;adding new line
;--------------
call new_line
;second string
;-------------
mov cl,str2[1]
mov si,2
Output2:
mov dl,str2[si]
mov ah,2
int 21h
inc si
loop output2         
exit:

mov ah,4ch
int 21h

new_line proc near
mov dl,10
mov ah,2
int 21h
mov dl,13
mov ah,2
int 21h   
ret 
new_line endp   

end

我试着用这个代码,但它确实工作:

mov si, 2
mov ch, 25 ;I have the max 25 char so I figured that I need to loop 25 times
color:
MOV AH,09         ; FUNCTION 9
MOV AL,str1[si] ; here i think i need to move my first element 
MOV BX,0004      ; PAGE 0, COLOR 4
MOV Cl,1 ; here I don't know how many elements I have because i take input from the user 
inc si
INT 10H              ; INTERRUPT 10 -> BIOS
INT 20H 
loop color             ; END
dpiehjr4

dpiehjr41#

你的尝试方向是对的,但也有一些缺陷。

  • 您的loop color指令依赖于整个16位寄存器CX,因此设置mov ch, 25是不够的!使用mov cx, 25
  • 由于循环是由CX寄存器控制的,因此您不能在内部将CL用于其他用途**,除非您以某种方式保留该值**。
  • INT 20H指令根本不属于此循环!
  • 有颜色的输出不能使光标前进。你需要另外做。一个简单的方法是使用bios.Teletype函数0 Eh。
mov  si, 2
  mov  cx, 25
  mov  bx, 0004h        ; Page 0, Color RedOnBlack
color:
  push cx               ; (1) Preserve CX
  mov  cx, 1            ; Repetition count
  mov  al, str1[si]
  inc  si
  mov  al, 09h
  int  10h              ; INTERRUPT 10 -> BIOS
  mov  ah, 0Eh
  int  10h
  pop  cx               ; (1) Restore CX
  loop color

一种不需要保留CX的替代方案,因为我们可以使用DX来控制循环:

mov  si, 2
  mov  dx, 25
  mov  cx, 1            ; Repetition count
  mov  bx, 0004h        ; Page 0, Color RedOnBlack
color:
  mov  al, str1[si]
  inc  si
  mov  al, 09h
  int  10h              ; INTERRUPT 10 -> BIOS
  mov  ah, 0Eh
  int  10h
  dec  dx
  jnz  color

相关问题