Nisy 发表于 2010-3-1 23:57:10

16位汇编中的变量定义和乘除法

随便写写测试的 ~

1. 汇编与C中变量的联系
------------------------------------------------

assume cs:code,ds:data

data segment
nData dw ?
data ends

code segment
start:
mov nData,offset start
mov nData,55h
mov ax,offset nData;
mov ax,nData
mov word ptr ,123
mov nData,123
add nData,123
mov ax,4c00h
int 21h

code ends
end start

------------------------------------------------

C:\masm5>debug test.exe
-u
1412:0000 C70600000000MOV   WORD PTR ,0000
1412:0006 C70600005500MOV   WORD PTR ,0055
1412:000C B80000      MOV   AX,0000
1412:000F A10000      MOV   AX,
1412:0012 C70600007B00MOV   WORD PTR ,007B
1412:0018 C70600007B00MOV   WORD PTR ,007B
1412:001E 830600007B    ADD   WORD PTR ,+7B

------------------------------------------------

汇编中定义变量的格式:nData dw ?
C语言中定义变量格式: int nData

在汇编环境中,nData只有两种形态:
1. 对数据进行操作:word ptr
2. 取地址:offset nData(汇编指令中将算出地址的具体数值)

add nData,123          <==> nData+=123
mov ax,offset nData    <==> mov ax,&nData

mov word ptr ,123 <==> mov word ptr ,xxx (该语法仅供演示)

word ptr <==> (int *)(offset nData)
byte ptr <==> (char*)(offset nData)

在汇编中用到 nData 和在C语言中用到 nData 是一个概念
nData 即代表一个变量名,也代表了该变量所对应的内存地址


2. 变量的定义和变量名的使用
------------------------------------------------
assume cs:code

data segment
nData dw 102 dup (?)
data ends

code segment
mov nData,ax   // 这样编译是不OK的
jmp s
nData1 db 128 dup(0)
s:
mov ax,0
mov word ptr ,ax

code ends
end

------------------------------------------------

此时 即使 mov nData,ax 中有ax,也无法使编辑通过,因为数据格式转化不匹配



3. CALL 和 JMP 的一些总结
------------------------------------------------

assume cs:code,ds:data

data segment
nData dw ?
data ends

code segment
start:
call @@
call short @@
call far ptr @@
jmp @@
jmp short @@
jmp near ptr @@

mov nData,ax
jmp s
;nData db 128 dup(0)
s:
mov ax,0
mov word ptr ,ax

@@:ret

code ends
end start
------------------------------------------------

C:\masm5>debug tt.exe
-u
1412:0000 E81C00      CALL    001F
1412:0003 E81900      CALL    001F
1412:0006 9A1F001214    CALL    1412:001F
1412:000B EB12          JMP   001F
1412:000D 90            NOP
1412:000E EB0F          JMP   001F
1412:0010 EB0D          JMP   001F
1412:0012 90            NOP
1412:0013 A30000      MOV   ,AX
1412:0016 EB01          JMP   0019
1412:0018 90            NOP
1412:0019 B80000      MOV   AX,0000
1412:001C A30000      MOV   ,AX
1412:001F C3            RET
------------------------------------------------

jmp short @@// 不需要加 ptr
jmp near ptr @@
jmp far ptr @@

jmp 和 call和相似
都是 直接直接对 IP 做加减

jmp 和 call 指令中 都可以无需添加 short near far ptr xxx 等修饰符 可以让编译器自己决定


4. DIV MUL 指令
------------------------------------------------

                     乘数 被乘数                           乘积
乘法:mul要么都为 8位(被乘数放AL中   乘数放内存或8位寄存器中)   放在AX中
            要么都为16位(被乘数放AX中乘数放内存或16位寄存器中)    放在 DX-AX中
         
            除数的位数决定被除数的长度             商   余数(高位放余数)
除法:div除数为8位时被除数为16位 放 AX 中      AL   AH
          除数为16位时 被除数为32位 放DX-AX中      AX   DX

------------------------------------------------

兔小样 发表于 2010-3-2 00:03:08

/:018 占座学习下,谢谢N哥哥!

zjid520 发表于 2010-3-31 19:56:50

谢谢老大的精典文章。受教了!

xiangdeanjing 发表于 2010-5-28 04:39:37

我怎么觉得汇编怎么那么难学啊~??
N老大有没啥秘诀?

lgcandcgl 发表于 2010-7-14 16:42:04

回复 4# xiangdeanjing


    汇编的结构和C语言本质上没什么区别,只是汇编更具有针对性,更加的针对底层硬件应用!
    程序中的循环就是整个程序的骨架!
    子程序就是程序的功能部分!(头、手、脚。。。)!
    程序中的命令,mov add sub 等就是肉了!~
    分开理解就好学了!
    汇编还有一个重要内容就是寄存器的使用!汇编命令基本上都是针对不同寄存器的操作!
页: [1]
查看完整版本: 16位汇编中的变量定义和乘除法