关于汇编里面xor的用法请教各位大神

woshihenwuzhi 2013-01-03 05:47:55
内容:
here:
mov al,1000b
xor byte ptr [kk1+1],al
xor byte ptr [kk1+5],al
xor byte ptr [kk1+9],al
xor byte ptr [kk2-3],al
kk1:
inc CNT1
inc CNT5
dec CNT3
cmp CNT3,0
jz kk2
dec CNT3
kk2:
cmp CNT1,0
jz here
jmp y3

本来要求所示字符串在一矩形框内一半从左另一半从右向中间移动,当两半相遇时又分别向两边移动,直至遇到两侧的边框双重新向中间移动,重复上述过程直至按任意键,则停止字符串动画显示返回到主菜单。
xor 那一段可以使他们两个相遇时分别向两边移动,小弟不懂,希望大家帮帮忙
...全文
1334 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
brider 2013-03-20
  • 打赏
  • 举报
回复
xor byte ptr [kk1+1],al xor byte ptr [kk1+5],al xor byte ptr [kk1+9],al xor byte ptr [kk2-3],al ;这4个语句的作用是动态修改程序代码,请注意kk1,kk2是语句标号 kk1: inc CNT1 ;inc CNT1,dec CNT3这些语句都是4字节长的,[kk1+1]访问的是inc CNT1,余下类推 inc CNT5 ;这两个指令的操作码为两个字节,xor 1000b 也就是xor 08H 后,inc指令变成dec指令 dec指令变成inc指令,也就实现了到边界就反向移动啦 dec CNT3 cmp CNT3,0 jz kk2 dec CNT3 kk2:
Jeset 2013-01-09
  • 打赏
  • 举报
回复
2楼正解大婶!!!!!
woshihenwuzhi 2013-01-03
  • 打赏
  • 举报
回复
CODE SEGMENT ASSUME CS:CODE,DS:CODE start: MOV AX,CODE MOV DS,AX mov ax,0b800h ;0b800h是文本模式下显存起始地址; ;0a000h是图形模式下显存起始地址; ;起始地址之后的一段内存数据决定了界面上显示的文字、图形、前背景色。 MOV ES,AX cld AGAIN: MOV AX,3 INT 10H ;读光标位置 lea dx,MENU ;MENU文件的主菜单 mov ah,9 int 21h ;显示字符串,DS:DX串地址,即MENU,画出方框图 input: mov ah,0 int 16h ;从键盘读一字符 cmp al,'1' jnz cp2 call sub01 ;召唤第一步,输入一个字符串 jmp input cp2:cmp al,'2' jnz cp3 call sub02 ;召唤第二步,字符串左右移动 jmp AGAIN ;返回到主菜单 cp3:cmp al,'3' ;返回DOS jnz input lea dx,MESG mov ah,9 int 21h mov ah,1 int 21h;接受字符 MOV AH,4CH INT 21H;结束 DELAY PROC PUSH CX PUSH DX;保护现场 MOV DX,1000;第二轮循环次数 D1:MOV CX,0ffffh;第一轮循环次数 LOOP $ ;若CX不等于零,跳转至当前代码地址的指令($=该指令在该代码段的偏移地址) DEC DX JNZ D1 POP DX POP CX;现场还原 RET DELAY ENDP sub01: mov ax,0e0dh;0dh为本行开头,0eh输出 int 10h mov al,0ah;0ah为下一行输出 int 10h lea dx,str;dx输入字符缓冲区首地址 mov ah,0ah int 21h ;输入一个字符串 mov ax,0e0ah;换行 int 10h ret sub02: cmp str+1,2;系统键入的字符个数 jnb y2 jmp quit y2:call line ;画矩形框 mov dl,60-2;框长度 mov al,str+1;字符长度 sub dl,al mov dh,0;dh清零 mov CNT3,dx mov bl,al inc al shr al,1;al+1/2 cbw mov CNT2,ax;右半边 sub bl,al mov bh,0 mov CNT4,bx;左半边 y3: mov bp,es push ds pop es mov di,1000h mov cx,CNT1 jcxz u1 mov al,20h rep stosb u1:lea si,buf;不知道 mov cx,CNT2 rep movsb mov cx,CNT3 jcxz u2 mov al,20h rep stosb u2:mov cx,CNT4 rep movsb mov cx,CNT5 jcxz u3 mov al,20h rep stosb u3: show: mov es,bp mov ah,70h;设置形式白底黑字 mov si,1000h mov di,left mov cx,60-2 ppp: lodsb stosw loop ppp mov ah,1 int 16h jnz sss ;按任意键,返回主菜单 call delay cmp CNT3,0 jnz kk1 here: mov al,1000b xor byte ptr [kk1+1],al xor byte ptr [kk1+5],al xor byte ptr [kk1+9],al xor byte ptr [kk2-3],al kk1: inc CNT1 inc CNT5 dec CNT3 cmp CNT3,0 jz kk2 dec CNT3 kk2: cmp CNT1,0 jz here jmp y3 sss:mov str+1,0 quit: lea si,CNT1 xor ax,ax mov cx,5 kk3:mov [si],ax inc si inc si loop kk3 xor di,di mov cx,80*25 mov ax,20h rep stosw ;清全屏 ret line: ;矩形框 mov di,(18*80+10)*2;起始位置 mov al,201 ;左上字符 mov ah,4;边框颜色 stosw mov cx,60-2; mov al,205 ;横框 rep stosw mov al,187 ;右上字符 stosw add di,20*2 mov al,186 ;竖框 stosw mov left,di mov cx,60-2 mov al,20H ;空格 rep stosw ;mov right,di mov al,186 ;竖框 stosw add di,20*2 mov al,200 ;左下角 stosw mov cx,60-2 mov al,205 ;横框 rep stosw mov al,188 ;右下角 stosw ret MENU DB 5 DUP(0AH) DB 31 DUP(' '),'MAIN MENU',0DH,0AH DB 25 DUP(' '),201,21 DUP(205),187,0DH,0AH;横线 DB 25 DUP(' '),186,' 1.Input a String ...',186,0DH,0AH;字符加竖线,186,0DH回车,0AH换行 DB 25 DUP(' '),186,' 2.Display Model ... ',186,0DH,0AH;同上 DB 25 DUP(' '),186,' 3.Return to DOS ... ',186,0DH,0AH;同上 DB 25 DUP(' '),200,21 DUP(205),188,0DH,0AH;横线 DB 28 DUP(' '),'Choice(1,2,3):$' MESG DB 0dh,0ah,0dh,0ah,9,'Press any key to exit ...$' CNT1 DW 0 ;前导空格长度 CNT2 DW 0 ;左半字符串长度 CNT3 DW 0 ;中间空格长度 CNT4 DW 0 ;右半字符串长度 CNT5 DW 0;末尾空格长度 ;num dw 2 left dw 0 ;right dw 0 str db 21,0 buf db 0dh,20 dup(0) CODE ENDS END start 这是完整的

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧