易只小白鸟 发表于 2018-1-25 14:38:47

汇编语言第三版p170有个地方不太明白

题目是:利用除法计算100001/100
答案是:
mov dx,1
mov ax,86A1H ;(dx)*10000H+AX=100001
mov bx,100
div bx

我不太明白的是,他这个被除数换成了16进制,但是除数100却没有换,我用debug看了下,没有换确实是对的,这里有些疑惑,请问怎么回事呢,谢谢

xiaohaituan 发表于 2018-1-25 14:52:46

没换是bx能放的下

cnkizy 发表于 2018-1-25 19:33:42

本帖最后由 cnkizy 于 2018-1-25 21:55 编辑

assume cs:codesg

codesg segment
start:       

                mov dx,1
                mov ax,86A1H ;(dx)*10000H+AX=100001
                mov bx,100
                div bx
       
                mov ax,4c00h
                int 21h

codesg ends
end start


1000 01(186A1H) / 100 (64H) = 1000(03E8H) ... 0001(0001H)

assume cs:codesg

codesg segment
start:       

                mov dx,1
                mov ax,86A1H ;(dx)*10000H+AX=100001
                mov bx,100H
                div bx
       
                mov ax,4c00h
                int 21h

codesg ends
end start


1000 01(186A1H) / 256 (100H) = 390(0186H) ... 0161(00A1H)



1000 01(186A1H) / 100 (64H) = 1000(03E8H) ... 0001(0001H)
1000 01(186A1H) / 256 (100H) = 390(0186H) ... 0161(00A1H)
100 和 100H 我这边算出来的肯定是有区别的。你仔细看看呢。

上面的是32位被除数 16位除数的计算。

你那个‘换’是啥意思 没能理解到意思呀。

如果是16位除以8位的 那一个 ax就能存下了 不需要dx+ax。al是商 ah是余数

xiaohaituan 发表于 2018-1-25 19:51:17

cnkizy 发表于 2018-1-25 19:33
1000 01(186A1H) / 100 (64H) = 1000(03E8H) ... 0001(0001H)




一个是十六进制一个是十进制肯定不一样,

cnkizy 发表于 2018-1-25 21:37:01

xiaohaituan 发表于 2018-1-25 19:51
一个是十六进制一个是十进制肯定不一样,

是啊 我知道,我就是给楼主说嘛 进制不对

比特阿尔法 发表于 2018-2-11 12:38:11

编译器的默认格式是 十进制,而要表示十六进制的数,在数字末尾要加H,所以在编译器看来,
86A1H是是十六进制的,编译不用进行转化,100没有加H,编译器默认他是十进制,编译时会处理的,所以最后在程序运行时都会转化为相同进制的。
页: [1]
查看完整版本: 汇编语言第三版p170有个地方不太明白