本文已参与「新人创作礼」活动,一起开启掘金创作之路。 8.6寻址方式的综合应用
汇编和C的对比
一般来说用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素
8.7div指令
除数、被除数的存放
结果的存放
div指令格式
div reg
div内存单元
相对基址变址寻址
通过乘法来模拟除法
div指令格式:
div reg(寄存器)
div mem(内存单元)
编程实现1(除数16位)-->被除数32位
编程实现2(除数8位)-->被除数16位
8.8伪指令dd
前面用db和dw定义字节型数据和字型数据
dd是用来定义dword(double word双字)型数据的。(32字节)
CPU64位
操作系统64位
在操作系统上工作的软件64位
问题8.1
assume ds:data,cs:code
data segment
dd 100001
dw 100
dw 0
data ends
code segment
start: mov ax,data
mov ds,ax
mov dx,ds:[2]
mov ax,ds:[0]
div word ptr ds:[4]
mov ds:[6],ax
mov ax,4c00h
int 21h
code ends
end start
8.9dup
dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号
dup示例
dup实操
一共十六个字符
ATTENTION(关于定义字型数据):
-
eg: 例如db '12345678990123456'(字节型数据)
此时字符串1234567890123456超过了一个字节的大小,会自动补充字节空间将剩余字符串填入
assume cs:code,ds:data
data segment
db 21 dup ('1234567890123456')
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,4c00h
int 21h
code ends
end start
2.eg: 例如dw'a'(字型数据)
当字符串不足两字节,自动填充凑满
assume cs:code,ds:data
data segment
dw 2 dup ('a')
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,4c00h
int 21h
code ends
end start
记录一次报错
error A2084:constant value too large
(常数值过大
Q:why
A:dw 是定义字型数据(占两个字节),而一个字符只占一个字节,‘40’是2个字节,刚好占一个字型数据
dw 'XX' ,单引号里面必须 小于 或者 等于 2个,cpu应该是这样子的,他每个 单引号 的内容作为 一个字型数据,所以 里面的数据不能大于 2个字节, 只能小于或者等于2个自己,如果是小于2个字节,你就会在高位自动加 0 填补, 如果你只想显示3个字符的那,你可以这样 dw '13','7' 这样也是一样的。
只有db可以将整个字符串在同一对单引号内给出
详见下文tips