2011 09 16
问题1 | FEES DW 100 DUP(?)FEES DW 100 DUP(0)请问DUP()里面的参数是什么意思?DUP前面的100 是不是操作100次的意思? | 对 100 就是定义100个括号里数值的东西 ?的意思是暂时不赋初值。 |
问题2: 关于 ASSUME |
以前学汇编时,始终搞不清楚assume是干什么用的,今天在论坛上搜了一下,发现一个网友这样解释:
| "在数据段中定义的每一个变量标志符其实都代表了一个偏移量(也称为有效地址),这个偏移量与 数据段段值相结合就指向某个内存地址。在程序中使用ASSUME伪指令是用来指明一个默认的段地址。一旦你把某个数据段的段名指定给某个段寄存器(比如ASSUME DS,DATA1),这之后当你使用这个数据段(DATA1)内定义的变量,编译程序就自动把它与这个段寄存器(DS)里的段值(表示一个段地址)结合起来使用。" |
ASSUME CS:CODE,DS:DATA: ASSUME伪指令指出各逻辑段所应该装填的地址,但并没有将段基址装入相应的段寄存器中。ASSUME指出了各段寄存器与当前被使用的逻辑段的对应关系。 CS是系统在加载程序后由系统自动装填的,即由操作系统的任务(进程)管理程序自动完成装填的。此项装填不需要用户管理。堆栈段SS也可以不用用户装填,可由系统自动装填,此时必须在定义堆栈段伪指令中,把参数写全 | ||
1楼说得对,文章没有说到点子上 其实简单说,就是为了省却每次输入段超越前缀的麻烦 例如MOV AX, A默认是使用DS的,但是如果A所在数据段用了ASSUME指定了ES的话, 这里就使用ES,而不是用默认的DS了.如果不用ASSUME,则要MOV AX, ES:A才能用ES;文中举的例子也不好. 见我前一个回复, 在指令中使用变量就是直接寻址方式 在直接寻方式下,默认就是使用DS,根本不需要ASSUME来指定变量对应的段寄存器;应该举一个ES的例子的;我想,如果程序只有一个程序段和一个数据段, 是不是就不需要ASSUME了呢?因为默认就是使用CS和DS的 | ||
ASSUME DS,DATA1是不对的:楼主应该是写: ASSUME DS: DATA1(一般不会用data1这样的标识符,data1一般用来表示变量名,而不是逻辑段名) 7楼正解: 【ASSUME指出了各段寄存器与当前被使用的逻辑段的对应关系】。也就是说虽然你在自己的程序中制定了数据逻辑段,但是系统并不知道,你需要告诉系统:ds段是和这个data(有的书籍喜欢用DSEG表示)段对应的,然后其里面的变量当然自动匹配了。。。 understand??? | ||
自己写的书上的第一个较完整的例子: | 写的过程中出错的地方: 【1】 count EQU 7 写成了: count DB 7 【2】 忘了写: mov ah, 4ch INT 21h 而且第二次,把 4ch赋值给了al。 【3】 写堆栈段时,可直接定义空间: DB 100h DUP(?) 不需要添加变量名 【4】 LOOP loop1 的用法: 先loop1,再使用 LOOP loop1 【5】 9个数相加方法: 我写的是,先清空al,然后将[SI]移到AL,然后INC SI,再ADD al,[SI] 其实: 直接清空AL,然后ADD,再INC SI就可以了,CX可以控制循环次数。前一种方法的循环次数要少一次,cx值也要注意。 | ; add 9 bytes NAME add9bytes qiaoDATA SEGMENT data1 DB 5 dup(1), 11h, 11h count EQU 7 SUM DB ? qiaoDATA ENDS qiaoSTACK SEGMENT STACK DB 100h DUP(?) qiaoSTACK ENDS qiaoCODE SEGMENT ASSUME DS:qiaoDATA; SS:qiaoSTACK; CS:qiaoCODE START: mov ax, qiaoDATA mov ds, ax ;这两句就是把qiaoDATA放入DS段,但是ASSUME已经有这个含义了,这里 ;不需要这两句也是ok的。 xor al, al LEA SI, data1 mov cx, count Loop1: ADD al, [SI] INC SI LOOP loop1 mov sum, al MOV ah,4ch INT 21h qiaoCODE ENDS end start |
其他 | 【6】 loop1作为标号,可以NEAE和FAR两种,但是这里没有使用。 【7】变量有三个属性: 段属性; 偏移属性; 类型属性; 【8】 常量如a3h以字母开头时,为了避免当做标识符混淆,需要以0开头 【9】字节:BYTE 字:WORD 双字: DWORD 四字:QWORD 十字节:TBYTE | |
e1.asm | NAME add9bytes qiaoDATA SEGMENT D1 DB 41h, 6dh D2 DW 803ah, 104fh D3 DD 12345678h, 0ABCDEF9H D4 DW 40 DUP(1) qiaoDATA ENDS qiaoSTACK SEGMENT STACK DB 100h DUP(?) qiaoSTACK ENDS qiaoCODE SEGMENT ASSUME DS:qiaoDATA; SS:qiaoSTACK; CS:qiaoCODE START: mov ax, qiaoDATA mov ds, ax ; real start mov ax, SEG D1 mov bx, SEG D2 mov cx, SEG D3 mov ax, OFFSET D1 MOV BX, OFFSET D2 MOV CX, OFFSET D3 MOV DX, OFFSET D4 mov ax, TYPE D1 MOV BX, TYPE D2 MOV CX, TYPE D3 MOV DX, TYPE D4 mov ax, LENGTH D1 MOV BX, LENGTH D2 MOV CX, LENGTH D3 MOV DX, LENGTH D4 mov ax, SIZE D1 MOV BX, SIZE D2 MOV CX, SIZE D3 MOV DX, SIZE D4 MOV ah,4ch INT 21h qiaoCODE ENDS end start | |
SEG | 取地址运算符 | mov ax, SEG D1 mov bx, SEG D2 mov cx, SEG D3 ;如果D1,D2都在DS数据段定义,则他们SEG后得到的值一致 |
OFFSET | 偏移地址运算符 | mov ax, OFFSET D1 ;0000 MOV BX, OFFSET D2 ;2 MOV CX, OFFSET D3 ;6 MOV DX, OFFSET D4 ; E=15 |
TYPE | 类型运算符 如果是Byte, =1 变量类型: word =2 dword=4 qword=8 tbyte= 10 标号类型: NEAR -1 FAR -2 | mov ax, TYPE D1 MOV BX, TYPE D2 MOV CX, TYPE D3 MOV DX, TYPE D4 |
LENGTH | 变量单元数(变量所包含的单元个数) 该运算结果根据: 该变量定义伪指令中第一个表达式的形式而定,如果是n UDP(),则为n,否则为1 | mov ax, LENGTH D1 MOV BX, LENGTH D2 MOV CX, LENGTH D3 MOV DX, LENGTH D4 P.S.: 即使D4 DW 40 DUP(1), 45h, 00h 有三处定义,但是也只是根据第一个40来回答,40=28H |
SIZE | 取变量总字节数 (该运算法所包含的总字节数,按照书上介绍的类似: qiaoVar DB 10 DUP(1), 11h, 22h 应该是12。但是事实上我测试的是只是按照第一个变量的字节数,即为10. | mov ax, SIZE D1 MOV BX, SIZE D2 MOV CX, SIZE D3 MOV DX, SIZE D4 |
HIGH | mov al,HIGH 1234h mov al,LOw 1234h | ;12 ;34 |
SHORT | 说明其后的标号在短距离(-128~127之间) | |
() | 改变优先级别 | |
[] | 间接寻址 | |
关系运算符 | ||
EQ 相等 NE 不相等 LT 小于 GT 大于 LE <= GE >= |