代码段内的汇编字符串修改

时间:2014-12-26 09:05:47

标签: assembly masm x86-16 serial-communication

好的,所以我在8086使用MASM DosBox,我在这里有两个问题,我无法真正找到解决方案。我现在一直在寻找一个没有用的解决方案,所以请保持友善和乐于助人。

我正在为自己做一些项目,这个项目是关于串行通信聊天,其中"欢迎屏幕"首先要求您提供' 用户名'然后将它带到MainMenu ...

首先问题是我希望欢迎屏幕等到另一台PC进入他的用户名'同样,它接收它,让我们说' PartnerName ' ...我无法通过Serial Comm UART-8250发送字符串串口,我只能为密钥发送立即值或ASCII。 (不,我不想循环整个String,Character by Character)那么如何将整个字符串作为一个帧发送?

这里的第二个问题是我在显示器上有一个通知部分,根据用户输入进行更新,事情就是我无法更新它......让我们说它是&# 34; TEST"默认情况下,当用户按下F1时,它应该通过" 更新你发送了一个聊天请求到[ PartnerName ] " ...让&#39 ; s称该字符串为" NotificationMsg "。所以要清楚,我无法更改NotificationMsg的内容,甚至可以添加" PartnerName "到最后。

如果我还不清楚,请随时向我询问您想知道的更多信息。

感谢您的时间,再次请您好好帮助!

编辑:这些是我的代码的部分,根据要求:

这部分来自一个名为"欢迎"的PROC。 AKA欢迎屏幕,它不应该返回,除非我在PartnerName中收到一个字符串我知道我的代码错了

;Reading PlayerName
mov ah,0ah
lea dx,PlayerName
int 21h

; Adding $ at the end, so we can print it later
mov bx,00
mov bl,PlayerName[1]
mov PlayerName[bx+2],'$'



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CHECKING FOR NAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SendingName:  ;Sending Player Name
mov dx,3fdh
in al,dx
test al,01000000b
jnz SendNameDone
jmp SendingName
SendNameDone:
lea ax,[PlayerName]
mov dx,3f8h 
out dx,ax


ReceivingName:  ;Receiving PLayer Name
mov dx,3fdh
in al,dx
test al,00000001b
jnz ReceiveNameDone
jmp ReceivingName   ;This will occur if nothing is received.
ReceiveNameDone:
mov dx,3f8h
in ax,dx
mov si,ax
mov di,OFFSET PartnerName
mov cx,15
movsb

mov dh,1   ;Row number
mov dl,1   ;Column number
mov bh,0
mov ah,2
int 10h

mov ah,09h
lea dx,PartnerName
int 21h

mov ah,01h
int 21h

这是" MainMenu"的另一部分。应该更新消息的地方

;Notification ONE
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:Notif1
int 21h
;Notification TWO
mov ah,02
mov dh,24d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:Notif2
int 21h

WaitKeyPrs:
mov ah,01h  ;Check for keystroke in the keyboard buffer.
int 16h
jz ReqRec   ;If zero = no key pressed. i.e. We check for Receiving.
mov ah,00h  ;Get keystroke from keyboard.
int 16h

cmp al,27d     ;Escape pressed !
jz QuitThis

SendReqID:
cmp al,3Bh     ;F1 comparing
jz F1Prs

cmp al,3Ch     ;F2 comparing
jz F2Prs

jmp WaitKeyPrs


ReqSend:        ;We send the Request here !
mov cl,al
mov dx,3fdh     ;We check if HoldReg is empty or not
in al,dx
test al,01000000b
jnz SendReqDone
jmp ReqRec
jmp ReqRec

SendReqDone:
mov al,cl
mov dx,3f8h 
out dx,al       ;By now, the Request should be sent.
jmp ReqRec


F1Prs:
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:ChatReqSend
int 21h
jmp ReqSend

F2Prs:
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:GameReqSend
int 21h
jmp ReqSend

在最后一段代码中,Notif1应该根据用户输入更新ChatReqSend或GameReqSend中的内容...所以我只需要在数据段中使用只有一个字符串并将其更新为选择,不只是使用另一个名为ChatReqSend或GameReqSend ...

的字符串

这是我的数据细分的一部分:

Data_segment_name segment para
Notif1 db 'TEST $'
Notif2 db 'TEST2 $'
ChatReqSend db 'You sent a Chat Request to.$'
GameReqSend db 'You sent a Game Request to.$'
ChatReqRec db 'You received a Chat Request from.$'
GameReqRec db 'You received a Game Request from.$'
ReqFlag db 00h ;0 If no request, 1 if chat, 2 if game.
PlayerName db 15,?,15 dup(?)
PartnerName db 15 dup (' ')
Data_segment_name ends

1 个答案:

答案 0 :(得分:0)

cmp al,3Bh     ;F1 comparing
jz F1Prs
cmp al,3Ch     ;F2 comparing
jz F2Prs

您需要与AH进行比较。那是具有扫描码的寄存器!

SendNameDone:
lea ax,[PlayerName]

我认为你需要在内存中高出2个字节的地址。

lea dx,DS:Notif1
lea dx,DS:Notif2
lea dx,DS:ChatReqSend

有几次你在DS中使用这些结构:但是你真的在某处初始化了DS寄存器吗?

PlayerName db 15,?,15 dup(?)

这可能会产生缓冲区溢出。您允许DOS输入15个字符,没有空间用于终止回车。更好地使用db 15,0,16,dup(?)。另请注意,我将第二个字节更改为零。它也有输入意义!