SI源变地止寄存器如何自动增减

cf0072 2007-04-22 10:39:21
看了几段的汇编代码,其中都有
利用SI寄存器的寄存器间接寻址。
我知道串处理指令中如:MOVSB,LODS,SCAS,CMPS等
在使用中都会具有对SI,DI的自动增减功能。
但是我看的这几段代码,没用到串处理指令
却仅仅是利用SI寄存器的寄存器间接寻址(在表格中递增的取到数)
其中两段代码没INC SI 的指令,另一段代码却有。

讲的不是很清楚,总之,我认为SI或DI自动增减功能只是
在串处理指令中使用的,而在其他单独使用SI寄存器寻址下
若要递增(递减)的查找表格应该另加INC SI 或DEC SI指令
不知对否。但为什么那两段代码却不加INC SI指令。谁能举个
不是串处理指令使用的SI 自动增减的例子
谢谢。。
...全文
483 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
paullbm 2007-04-23
  • 打赏
  • 举报
回复
但为什么那两段代码却不加INC SI指令。

====================

把那兩段代碼貼出來看看!!
JeanChenYu 2007-04-23
  • 打赏
  • 举报
回复
Maybe it uses lea si,[si+1]?
zara 2007-04-23
  • 打赏
  • 举报
回复
应该是这样的吧. 把你手头的那个没有 INC SI 指令的代码贴上来看看?
cf0072 2007-04-23
  • 打赏
  • 举报
回复
谢谢你的调试。哈,我很懒得去做。
看来是书中的问题,我还总以为SI自动增减还藏着其他的未知,就
目前看来也只有在串处理指令中了。
paullbm 2007-04-23
  • 打赏
  • 举报
回复
確實只會輸入131313
改為:
確實只會輸出131313


如果在指定位置加入INC SI就能正常輸出這三個十六進數了!
paullbm 2007-04-23
  • 打赏
  • 举报
回复
哦。如果沒有加inc si的話,確實只會輸入131313
你可以在
dec bx
jnz L
之前加入一條inc si就OK了


PS:看來是我看錯了!

cf0072 2007-04-23
  • 打赏
  • 举报
回复
谢谢,不知道是楼上的看错了还是我不懂。
我问的是为什么SI如何变化的,上面那代码中SI如何自动指定到下个字节的?
好像没变化呀
paullbm 2007-04-23
  • 打赏
  • 举报
回复
想必你在這兩個程序中都看到
dec bx
jnz L
這兩條指令了吧

jnz是一條條件轉移指令,它跳轉的條件就是當ZF=0時進行跳轉!
從上述題意可知,當bx不為零時則跳至標號L處。這就實現了循環!!


下面是對dec指令對ZF標志位影響的一個DEBUG例子:

C:\DOCUME~1\LBM>debug
-a
0AEE:0100 mov bx,1
0AEE:0103 dec bx
0AEE:0104
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AEE ES=0AEE SS=0AEE CS=0AEE IP=0100 NV UP EI PL NZ NA PO NC
0AEE:0100 BB0100 MOV BX,0001
-t

AX=0000 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AEE ES=0AEE SS=0AEE CS=0AEE IP=0103 NV UP EI PL NZ NA PO NC
0AEE:0103 4B DEC BX
-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AEE ES=0AEE SS=0AEE CS=0AEE IP=0104 NV UP EI PL ZR NA PE NC



============
NZ表示ZF!=0,ZR表示ZF=0
cf0072 2007-04-23
  • 打赏
  • 举报
回复
下面这个程序是将BCD 字节缓冲区中的数据转换为十六进制数并输出

data segment
bcd db 13h,5dh,0afh
count=$-bcd;缓冲区长度
crlf db 0dh,0ah,24h
data ends


code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax

lea si,bcd ; 这里置初值
mov bx,count ;用BX来计数

L;mov dl,[si]
mov cl,4
shr dl,cl
cmp dl,9
jbe N1
add dl,7
N1:add dl,30h
mov ah,2
int 21h
;先提取高4位并显示

mov dl,[si]
and dl,0fh
cmp dl,9
jbe N2
add dl,7

N2:add dl,30h
mov ah,2
int 21h ;到这里应该是提取低四位并显示
dec bx ;。。。。。。。。。。。。。。。。这里没有INC SI?那SI如何指定到下个字节呢?
jnz L

mov ah,4ch
int 21h

code ends
end start



cf0072 2007-04-23
  • 打赏
  • 举报
回复
下面这个程序是将BCD 字节缓冲区中的数据转换为十六进制数并输出

data segment
bcd db 13h,5dh,0afh
count=$-bcd
crlf db 0dh,0ah,24h
data ends


code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax

lea si,bcd
mov bx,count

L;mov dl,[si]
mov cl,4
shr dl,cl
cmp dl,9
jbe N1
add dl,7

N1:add dl,30h
mov ah,2
int 21h
mov dl,[si]
and dl,0fh
cmp dl,9
jbe N2
add dl,7

N2:add dl,30h
mov ah,2
int 21h
dec bx
jnz L

mov ah,4ch
int 21h

code ends
end start



cf0072 2007-04-23
  • 打赏
  • 举报
回复
谢谢 刚忙到现在。
我就把那几段代码打出来吧。。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧