汇编语言中ptr的作用是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言中ptr的作用是啥相关的知识,希望对你有一定的参考价值。

汇编语言中ptr的作用是什么

ptr-pointer (既指针)得缩写。汇编里面ptr是规定的字(既保留字),是用来临时指定类型的。可以理解为,ptr是临时的类型转换,相当于C语言中的强制类型转换。

如 mov ax,bx ;  是把BX寄存器“里”的值赋予ax,由于二者都是寄存器,长度已定(word型),所以没有必要加“WORD”。

“mov ax,word ptr [bx];”是把内存地址等于“BX寄存器的值”的地方所存放的数据赋予ax。

由于只是给出一个内存地址,不知道希望赋予ax的,是byte还是word,所以可以用word明确指出;如果不用,(mov ax,[bx];)则在8086中是默认传递一个字,即两个字节给ax。

扩展资料

ptr也可以作为临时类型转换

(1)“cmp word ptr[si],'#'”是用si所指向的内存的连续两个字节与‘#’比较,要是改成cmp byte ptr[si],'#'那就是用si指向的那个存储单元的内容(一个字节)与‘#’比较了。

(2)“jmp near ptr opd”是无条件转移指令,转移到段内的标号opd所标识的位置(近类型)。若是“jmp far ptr opd”那就是转移到另外一个代码段的opd所标识的位置了(远类型)。

参考资料来源:百度百科-指针

参考技术A ptr应该就是pointer ,说明地址指针类型。
当两个操作数类型均不明确时,必须用byte ptr(字节属性)或Word ptr(字属性)将一个存储器操作数定义为字节或字类型。
如:
mov byte ptr [si],oah ;(指明[si] 为字节类型)。
参考技术B 列举两种用法
MOV [BX] ,WORD PTR 10H; 立即数对内存单元赋值,两个类型都不明确
MOV BL, BYTE PTR NUM; 将内存字型数据取前一个字节数据
MOV BL, BYTE PTR NUM+1; 将内存字型数据取后一个字节数据
参考技术C

x86 CPU 可以执行 16 位数的指令,也可以执行 8 位数的指令。

位数是多少?

在指令中,你如果不写清楚,CPU 就无法干活。

针对寄存器的指令,如:

  MOV CX,200、

  INC AL

寄存器的位数,就是非常清楚的。

--------

而,针对存储器的指令,如:

  MOV [BX],20H。

则有可能是一个字节、或两个字节的传送。。。

位数,不确定,CPU 就无法执行。

--------

那么,这条指令,就必须如下写:

 MOV BYTE PTR [BX],20H

 MOV WORD PTR [BX],20H

 MOV DWORD PTR [BX],20H

分别代表:8 位数、16 位数、32 位数的传送。 

参考技术D 显示声明
http://wenku.baidu.com/view/2972a8d4b9f3f90f76c61b76.html

参考资料:http://wenku.baidu.com/view/2972a8d4b9f3f90f76c61b76.html

如何使用 DWORD PTR(汇编语言)打印负整数

【中文标题】如何使用 DWORD PTR(汇编语言)打印负整数【英文标题】:how to print negative integer using SWORD PTR(assembly lang) 【发布时间】:2021-05-29 05:39:26 【问题描述】:

我正在学习 x86 汇编语言,但不知道如何使用 Irvine32 库打印负整数。

INCLUDE Irvine32.inc

.data

arry    SWORD   10, -20, 30

.code
main PROC
    mov     eax,    0
    mov     esi,    OFFSET arry
    mov     ax,     SWORD PTR [esi]
    add     esi,    TYPE arry
    add     ax,     SWORD PTR [esi]
    call    WriteInt
    exit
    ;call   DumpRegs
    

main ENDP
end main

我期望的结果是 -10,但控制台打印了 +65526。我不知道 WriteInt 函数是如何工作的,但它似乎将 ax 中的值识别为无符号值。

如果我像这样修改我的代码,那么 WriteInt 函数会给我正确的结果。(-10)

...
    mov     eax,    10
    sub     eax,    20
    call    WriteInt
...

我想从内存中读取数据并加减整数。如果我想打印为有符号整数怎么办?

【问题讨论】:

【参考方案1】:

movsx eax, SWORD PTR [esi] 将其符号扩展为 WriteInt 的双字寄存器。

WriteInt 总是查看整个 32 位,而您给它的 32 位数字(使用位模式 0x0000fff6)被解释为 32 位 2 的补码,表示一个正数。

如果有一个 WriteShort 函数,您可以调用它,它会查看第 15 位而不是第 31 位来确定数字是否为负数,但是当我们可以符号扩展至一个完整的寄存器。


注意您在加载 AX 之前使用的 mov eax,0:这样做是显式地进行零扩展,这是模拟 movzx eax, word ptr [esi] 的低效方式。 (如果你不这样做,EAX 的高 16 位将保存调用 main 的代码中的任何垃圾。)

还有其他方法可以进行 2 的补码符号扩展,即将数字的符号位复制到完整寄存器的高位。例如,cwde 在已经加载到 AX 之后,甚至是shl eax, 16 / sar eax, 16。但是MOVSX 在寄存器中没有窄值时最有效。

或者在 AX 中使用 16 位相加结果,cwde 只是编写movsx eax, ax 的一种更有效的方式。

(有趣的事实:CWDE 是可追溯到 8086 的指令的 32 位版本。在 386 之前,您只能使用 AL 或 AX 中的数字有效地进行符号扩展,而不是从任何地方到任何寄存器。)


为避免在添加中出现带符号溢出的可能性,您可能希望在添加之前将两个输入都 movsx 例如这样就可以得到 0x7fff + 0x7fff = 0x0000fffe, 65534。 不是 0xffffffe,也就是 -2,如果在两个正数的 16 位相加溢出产生负结果后进行符号扩展,就会得到。

(两个 n 位数字的和或差最多需要 n+1 位来精确表示,所以加宽使得溢出不可能。要溢出 32 位和,你必须添加大约 2^ 16 字。)

【讨论】:

@Jasper:另请参阅我的编辑:发布后我意识到您不仅在打印加载结果,而且还在打印添加结果。因此,您可能希望 movsx 两个输入以使溢出不可能。 谢谢,学习了很多我不知道的东西

以上是关于汇编语言中ptr的作用是啥的主要内容,如果未能解决你的问题,请参考以下文章

opencv运行时,出错误,反汇编10035FDC mov eax,dword ptr [edi+10h] 是啥意思?

如何使用 DWORD PTR(汇编语言)打印负整数

汇编语言中 LEA DX,S MOV AH,9 INT 21H具体意思是啥,请大师指教。

汇编语言中的call是啥意思?

汇编语言中的DEC是啥意思?

汇编语言中的call是啥意思