汇编语言:PTR 和LABEL 的不同?详解!
8086CPU的指令,可以处理两种尺寸的数据,byte和word。
所以在机器指令中要指明,指令进行的是字操作还是字节操作。
对于这个问题,汇编语言中用以下方法处理。
(1)通过寄存器名指明要处理的数据的尺寸。
例如:下面的指令中,寄存器指明了指令进行的是字操作: mov ax,1 mov bx,ds:[0] mov ds,ax mov ds:[0],ax inc ax add ax,1000 下面的指令中,寄存器指明了指令进行的是字节操作: mov al,1 mov al,bl mov al,ds:[0] mov ds:[0],al inc al add al,100 (2)在没有寄存器名存在的情况下,用操作符 X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。
例如:下面的指令中,用word ptr指明了指令访问的内存单元是一个字单元: mov word ptrds:[0],1 inc word ptr[bx] inc word ptrds:[0] add word ptr[bx],2 下面的指令中,用byte ptr指明了指令访问的内存单元是一个字节单元: mov byte ptr ds:[0],1 inc byte ptr [bx] inc byte ptr ds:[0] add byte ptr [bx],2 在没有寄存器参与的内存单元访问指令中,用word prt 或byte ptr显性地指明所要访问的内存单元的长度是很必要的。
否则,CPU无法得知所要访问的单元,还是字节单元。
假如我们用Debug查看内存的结果如下: 2000:1000 FF FF FF FF FF FF ...... 那么指令: mov ax,2000H mov ds,ax mov byte ptr[1000H],1 将使内存中的内容变为: 2000: 1000 01 FF FF FF FF FF ...... 而指令: mov ax,2000H mov ds,ax mov word ptr[1000H],1 将使内存中的内容变为: 2000:1000 01 00 FF FF FF FF ...... 这是因为 mov byte ptr[1000H],1访问的是地址为 ds:1000H 的字节单元,修改的是ds:1000H 单元的内容;而mov word ptr[1000H],1 访问的是地址为 ds:1000H 的字单元,修改的是 ds:1000H 和 ds:1001H 两个单元的内容。
(3) 其他方法 有些指令默认了访问的是字单元还是字节单元,比如:push [1000H] 就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。
建立磁盘卷标命令 功能:建立、更改、删除磁盘卷标。
格式:LABEL[盘符:][卷标名] 使用说明:卷标名为要建立的卷标名,若缺省此参数,则系统提示键入卷标名或询问是否删除原有的卷标名;卷标名由1至11个字符组成。
[1]
...7,8 DISP DW 2 LEA BX,NUM ADD BX,DISP MOV AX,WORD PTR[...
LEA BX,NUM ;bx存放的是数据的地址ADD BX,DISP ;bx+2使得bx指向NUM后的第三个存储单元(这个bx就好像数组的下标,你懂的)MOV AX,WORD PTR[BX] ;此处送给AX的是一个字的数据(16位),也就是要从地址bx开始往后读取两个字节的数据,根据高位对高位的原则,结果必然是0403H。
希望能帮到你。
汇编add byte ptr ds:[eax],al是什么意思?
展开全部 补充回答:没有注意那两个数的大小已经超出16位寄存器所能容纳的范围,应该用双字定义、双字相加。
已经修改。
非常抱歉。
Data segment d1 DD 99251 Data Ends Extra segment d2 DD -15962 d3 DD ? Extra Ends Code segment assume cs:Code,ds:Data,es:Extra start: mov ax,Data mov ds,ax mov ax,Extra mov es,ax mov ax,word ptr d1 add ax,word ptr es:d2 mov dx,word ptr d1[2] adc dx,word ptr es:d2[2] mov word ptr es:d3,ax mov word ptr es:d3[2],dx mov ax,4c00h int 21h Code Ends end start...
汇编语言在debug中
MOV AX, WORD PTR [BX]MOV DX, WORD PTR [BX+2]ADD AX, WORD PTR [BX+4]ADC DX, WORD PTR [BX+6]ADD AX, WORD PTR [BX+8]ADC DX, WORD PTR [BX+10]MOV [BX], AXMOV [BX+2],DX 双字数据切记高对高低对低,就是高位在高地址低位在低地址
关于汇编的问题
0040B750 push ebp0040B751 mov ebp,esp0040B753 sub esp,40h0040B756 push ebx0040B757 push esi0040B758 push edi0040B759 lea edi,[ebp-40h]0040B75C mov ecx,10h0040B761 mov eax,0CCCCCCCCh0040B766 rep stos dword ptr [edi]0040B768 movsx eax,word ptr [ebp+8]0040B76C test eax,eax0040B76E jle fun+2Fh (0040b77f)0040B770 push offset string "+" (00420f24)0040B775 call printf (00401060)0040B77A add esp,40040B77D jmp fun+5Bh (0040b7ab)0040B77F movsx ecx,word ptr [ebp+8]0040B783 test ecx,ecx0040B785 jne fun+46h (0040b796)0040B787 push offset string "0" (0042012c)0040B78C call printf (00401060)0040B791 add esp,40040B794 jmp fun+5Bh (0040b7ab)0040B796 movsx edx,word ptr [ebp+8]0040B79A test edx,edx0040B79C jge fun+5Bh (0040b7ab)0040B79E push offset string "ok" (0042001c)0040B7A3 call printf (00401060)0040B7A8 add esp,40040B7AB pop edi0040B7AC pop esi0040B7AD pop ebx0040B7AE add esp,40h0040B7B1 cmp ebp,esp0040B7B3 call __chkesp (004010e0)0040B7B8 mov esp,ebp0040B7BA pop ebp0040B7BB ret*程序入口在这里0040B7C0 push ebp0040B7C1 mov ebp,esp0040B7C3 sub esp,4Ch0040B7C6 push ebx0040B7C7 push esi0040B7C8 push edi0040B7C9 lea edi,[ebp-4Ch]0040B7CC mov ecx,13h0040B7D1 mov eax,0CCCCCCCCh0040B7D6 rep stos dword ptr [edi]0040B7D8 lea eax,[ebp-4]0040B7DB push eax0040B7DC push offset string "%d" (00420f74)0040B7E1 call scanf (0040da80)0040B7E6 add esp,80040B7E9 movsx ecx,word ptr [ebp-4]0040B7ED add ecx,3E8h0040B7F3 mov word ptr [ebp-8],cx0040B7F7 mov dx,word ptr [ebp-8]0040B7FB push edx0040B7FC call @ILT+5(_fun) (0040100a)0040B801 add esp,40040B804 lea eax,[ebp-4]0040B807 push eax0040B808 push offset string "%d" (00420f74)0040B80D call scanf (0040da80)0040B812 add esp,80040B815 movsx ecx,word ptr [ebp-4]0040B819 imul ecx,ecx,50040B81C sub ecx,20040B81F mov word ptr [ebp-8],cx0040B823 mov dx,word ptr [ebp-8]0040B827 push edx0040B828 call @ILT+5(_fun) (0040100a)0040B82D add esp,40040B830 lea eax,[ebp-4]0040B833 push eax0040B834 push offset string "%d" 0040B839 call scanf (0040da80)0040B83E add esp,80040B841 movsx ecx,word ptr [ebp-4]0040B845 test ecx,ecx0040B847 jle main+92h (0040b852)0040B849 movsx edx,word ptr [ebp-4]0040B84D mov dword ptr [ebp-0Ch],edx0040B850 jmp main+9Bh (0040b85b)0040B852 movsx eax,word ptr [ebp-4]0040B856 neg eax0040B858 mov dword ptr [ebp-0Ch],eax0040B85B mov cx,word ptr [ebp-0Ch]0040B85F mov word ptr [ebp-8],cx0040B863 mov dx,word ptr [ebp-8]0040B867 push edx0040B868 call @ILT+5(_fun) (0040100a)0040B86D add esp,40040B870 pop edi0040B871 pop esi0040B872 pop ebx0040B873 add esp,4Ch0040B876 cmp ebp,esp0040B878 call __chkesp (004010e0)0040B87D mov esp,ebp0040B87F pop ebp0040B880 ret
最后的几行汇编代码看不懂
C++我不会,我给你注释一下汇编的:xor ecx, ecx ;ECX清零mov cl,k ;这时ECX=Kmov eax,[wordval]shl eax,cl ;左移K位shr eax, 16 ;右移16位dec cl bt eax,ecx ;把EAX中第K位的值放入CF,(电脑是从0开始计位的)jc end_macro ;如果CF为1则跳到end_macro,为0则执行下面的signed_value:inc cl ;恢复ECX=Kmov ebx,[start_neg_pow2] ;将变量start_neg_pow2的值存入EBX,应该是个指针,但不知道你在哪定义的?add ax,word ptr [ebx+ecx*2] ;将指针的第K个字...C++我不会,我给你注释一下汇编的:xor ecx, ecx ;ECX清零mov cl,k ;这时ECX=Kmov eax,[wordval]shl eax,cl ;左移K位shr eax, 16 ;右移16位dec cl bt eax,ecx ;把EAX中第K位的值放入CF,(电脑是从0开始计位的)jc end_macro ;如果CF为1则跳到end_macro,为0则执行下面的signed_value:inc cl ;恢复ECX=Kmov ebx,[start_neg_pow2] ;将变量start_neg_pow2的值存入EBX,应该是个指针,但不知道你在哪定义的?add ax,word ptr [ebx+ecx*2] ;将指针的第K个字元素与AX相加(注意,这里是字操作,wordval强制变换成16位了)end_macro:
用汇编语言实现如下程序:进行自然数相加(1+2+3+……+N)。
必须...
@N 的极限是92681。
以下程序将其赋值 100000 时,它返回的为92681。
当你给定的@N 在92681以内时,它会输出自然数累加结果。
(程序是用16位的寄存器实现,比32位的寄存器实现要复杂很多 !) CODE SEGMENT ASSUME CS:CODE @N DD 100000 START: PUSH CS POP DS PUSH CS POP ES MOV AX,0 MOV DX,0 MOV SI,0 MOV DI,0 MOV CX,WORD PTR @N MOV BX,WORD PTR @N+2 @0: ADD AX,SI ADC DX,DI JC @ERR ADD SI,1 ADC DI,0 SUB CX,1 JNC @0 SBB BX,0 JNC @0 CALL DISPDXAX @EXIT: MOV AH,4CH INT 21H @ERR: SUB SI,1 SBB DI,0 MOV AX,SI MOV DX,DI CALL DISPDXAX JMP @EXIT DISPDXAX PROC NEAR ; 将要显示的32位无符号数置于dx、ax中 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSHF MOV WORD PTR [Y],AX MOV WORD PTR [Y+2],DX MOV AX,WORD PTR [Y] MOV DX,WORD PTR [Y+2] MOV BX,WORD PTR [Z] MOV CX,WORD PTR [Z+2] MOV WORD PTR N,0 MM0: INC WORD PTR N SUB AX,BX SBB DX,CX JNC MM0 DEC WORD PTR N ADD AX,BX ADC DX,CX MOV WORD PTR[Y],AX MOV WORD PTR[Y+2],DX MM1: LEA DI,CC ADD DI,9 M2: MOV AX,WORD PTR [Y] MOV DX,WORD PTR [Y+2] MOV BX,10000 DIV BX PUSH AX PUSH DX POP DX MOV CX,4 MOV AX,DX M3: MOV DX,0 MOV BX,10 DIV BX ADD DL,30H MOV [DI],DL DEC DI LOOP M3 POP AX MOV CX,1 M4: MOV DX,0 MOV BX,10 DIV BX ADD DL,30H MOV [DI],DL DEC DI LOOP M4 MOV AX,WORD PTR N MOV CX,5 M5: MOV DX,0 MOV BX,10 DIV BX ADD DL,30H MOV [DI],DL DEC DI LOOP M5 LEA DX,LFCR MOV AH,9 INT 21H MOV CX,9 LEA SI,CC M6: MOV AL,[SI] CMP AL,'0' JNE M7 MOV BYTE PTR [SI],32 INC SI LOOP M6 M7: LEA DX,CC MOV AH,9 INT 21H POPF POP BP POP DI POP SI POP DX POP CX POP BX POP AX RET Y DD ? CC DB 10 DUP(' '),10,13,'$' LFCR DB 10,13,'$' Z DD 100000 N DW 0 DISPDXAX ENDP CODE ENDS END START
汇编题目怎么做?
CN1 EQU 1000H CN2 EQU -2 MOV AX,CN2 ;数值在计算机中以补码表示,-2的补码,以字节表示是0FEH,以字(双字节)表示是0FFFEH。
所以,AX=0FFFEHMOV BX,CN1 ;BX=1000HMOV DS:[2000H],AX ;DS:[2000H]=0FEH,DS:[2001H]=0FFHINC WORD PTR[BX] ;DS:[1000H]增1XCHG AX,BX ;AX=1000H,BX=0FFFEHINC BX ;BX=0FFFFHADD AX,BX ;AX=0FFFH,有进位,CF=1此程序执行完后,BX=0FFFFHAX=0FFFHDS:[2001H]=0FFHDS:[2000H]=0FEH
超简单汇编语句问题
这条指令的意思是:将ECX的值按DWORD类型传递给EAX所指的地址中。
首先你要明白MOV EAX,[EBX]这条指令中的[EBX]仅仅指的是一个地址,而并不是一个地址中的值。
因为你想,如果[EBX]代表一个值的话,那么他是多少呢?是多少字节呢?不确定。
只有当第一个操作数EAX时才知道是取[EBX]地址的指向的前32位数据。
所以[EBX]是一个地址。
那么MOV DWORD PTR [EAX],ECX这条指令中的[EAX]同样也是一个地址,你要向这个地址赋一个值。
但你并不知道这个值是多少,是多少字节的。
只有当用DWORD PTR时才知道数据是多少字节的。
呵呵,不知道我有没有说清楚。
如有错误的地方还请朋友们指正。
谢谢。
转载请注明出处51数据库 » 汇编 add word ptr
淡忘NB