回 帖 发 新 帖 刷新版面

主题:[讨论]一道算术题目(用汇编写)

试编写一程序计算以下表达式的值。
w=(v-(x*y+z-540))/x   
式中x、y、z、v均为有符号字数据。
设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中。
////////////////////////////////////////////////////////////////////

我在x*y后有进位,不知道怎么写,

回复列表 (共3个回复)

沙发

.model small
.stack
.data
x sword 10
y sword -20
z sword 1000
v sword 3000
w dd ?
.code
.startup
    ;w=(v-(x*y+z-540))/x
   mov ax,x
   imul y       ;x*y
   add ax,z     ; x*y+z
   adc dx,0
   sub ax,540   ;x*y+z-540
   sbb dx,0
   mov bx,v     ;32位减法被减数的低16位v放在BX中
   or bx,bx
   .if sign?
    mov cx,0ffffh
   .else 
    mov cx,0      ;32位减法被减数的高16位放在CX中
   .endif
   sub bx,ax      ;低16位减法
   sbb cx,dx      ;高16位减法
   mov dx,cx      ;差的高16位在DX中
   mov ax,bx      ;差的低16位在AX中
   idiv x          ;(v-(x*y+z-540))/x
   mov word ptr w,ax    ;商在W的低2字节
   mov word ptr w[2],dx  ;余数在高2字节
   
.exit 0
end


E:\all_soft\WinMasm1.02>debug f17.exe
-d
0B6C:0000  BA 70 0B 8E DA 8C D3 2B-DA D1 E3 D1 E3 D1 E3 D1   .p.....+........
0B6C:0010  E3 FA 8E D2 03 E3 FB A1-0A 00 F7 2E 0C 00 03 06   ................
0B6C:0020  0E 00 83 D2 00 2D 1C 02-83 DA 00 8B 1E 10 00 B9   .....-..........
0B6C:0030  00 00 2B D8 1B CA 8B D1-8B C3 F7 3E 0A 00 A3 12   ..+........>....
0B6C:0040  00 89 16 14 00 B8 00 4C-CD 21 0A 00 EC FF E8 03   .......L.!......
0B6C:0050  B8 0B [color=FF0000]00 00 00 00 [/color]43 E8-08 0A 73 C5 AC 2E 88 07   ......C...s.....
0B6C:0060  43 EB BE 4E 2E 89 36 4C-91 2E C6 07 00 2E 89 1E   C..N..6L........
0B6C:0070  5B 91 26 8B 1D 8D 36 5F-91 2E 80 3C 2F 74 36 2E   [.&...6_...</t6.
-g

Program terminated normally
-d 0b6c:0
0B6C:0000  BA 70 0B 8E DA 8C D3 2B-DA D1 E3 D1 E3 D1 E3 D1   .p.....+........
0B6C:0010  E3 FA 8E D2 03 E3 FB A1-0A 00 F7 2E 0C 00 03 06   ................
0B6C:0020  0E 00 83 D2 00 2D 1C 02-83 DA 00 8B 1E 10 00 B9   .....-..........
0B6C:0030  00 00 2B D8 1B CA 8B D1-8B C3 F7 3E 0A 00 A3 12   ..+........>....
0B6C:0040  00 89 16 14 00 B8 00 4C-CD 21 0A 00 EC FF E8 03   .......L.!......
0B6C:0050  B8 0B [u]12 01 00 00 [/u]43 E8-08 0A 73 C5 AC 2E 88 07   ......C...s.....
0B6C:0060  43 EB BE 4E 2E 89 36 4C-91 2E C6 07 00 2E 89 1E   C..N..6L........
0B6C:0070  5B 91 26 8B 1D 8D 36 5F-91 2E 80 3C 2F 74 36 2E   [.&...6_...</t6.

板凳


.if sign?
    mov cx,0ffffh
   .else 
    mov cx,0      ;32位减法被减数的高16位放在CX中

这里好象是判断V是负数还是正数吧?
如果是负数,怎么要将高位置为0ffffh呢?

3 楼

数据在内存是补码表示的,若为负数,则高位应该是全1表示真值的全0

我来回复

您尚未登录,请登录后再回复。点此登录或注册